韌館-LearnHouse

[轉載]如何比較Windows與Liunx下所產生的文字檔? (SOC) (NC-Verilog) (VCS) (UltraEdit)

Abstract
為了驗證RTL的結果是否與原本用C或者Matlab所描述的演算法等效,我們常會將Verilog與C或者Matlab的結果dump到文字檔,然後用UltraEdit比較,為什麼明明用UltraEdit看起來一樣,但使用UltraCompare比較卻不同呢?

Introduction
使用環境:Visual Studio 2010 + NC-Verilog 5.4 + UltraEdit 13.10a+2

本文將討論以下主題:

1.Windows與Linux文字檔格式的差異

2.為什麼用UltraEdit開啟Linux的文字檔與Notepad開啟結果不一樣?

3.如何使用UltraCompare比較Windows與Linux下所產生的文字檔?

4.Conclusion

Windows與Linux文字檔格式的差異

在此我們做一個小小的實驗,同時用Visual Studio 2010的C語言與NC-Verilog (DOS版,但因為是由Linux版移植,所以所產生的文字檔一樣是Linux格式)產生相同內容的文字檔,試著比較其結果的差異。

simple_text.c / C

复制代码
1 /* 2 (C) OOMusou 2011 http://oomusou.cnblogs.com 3 4 Filename : simple_text.c 5 Compiler : Visual C++ 10.0 6 Description : simple text 7 Release : Jun.15,2011 1.0 8  */ 9 10 #include <stdio.h> 11 12  int main() { 13 FILE *fp; 14 int i; 15 16 fp = fopen("simple_text.txt", "w"); 17 for(i = 0; i < 2; i++) 18 fprintf(fp, "%1d\n", i); 19 20 fclose(fp); 21 }
复制代码

執行結果

0 1

simple_text.v / Verilog

复制代码
1 /* 2 (C) OOMusou 2011 http://oomusou.cnblogs.com 3 4 Filename : simple_text.v 5 Simulator : NC-Verilog 5.4 6 Description : simple text 7 Release : Jun.15,2011 1.0 8  */ 9 10  module simple_text_tb; 11 12 integer fp; 13 integer i; 14 15 initial begin 16 fp = $fopen("simple_text.txt"); 17 18 for(i = 0; i < 2; i = i + 1) 19 $fwrite(fp, "%1d\n", i); 20 21 $fclose(fp); 22 end 23 24 endmodule
复制代码

執行結果

0 1

理論上,這兩個文字檔應該完全相同,在Windows下用Notepad去開啟C所產生的文字檔,與在Linux用Gedit去開啟Verilog所產生的文字檔,看起來是完全一樣的。

但若用UltraEdit使用Hex Edit (編輯 –> 十六進位功能 –> 十六進位編輯) 會發現兩者的不同:

使用UltraEdit去開啟C所產生的文字檔

text00

使用UltraEdit去開啟Verilog所產生的文字檔

text01

比較兩者的差異,UltraEdit會在下方很聰明地告訴你這是DOS還是UNIX下的文字檔,除了文字檔本身的內容外(0的ACSII表示法16進位值為0x30,1為0x31),剩下兩者的差異就在換行方式的不同。

Windows使用的換行符號為0x0D與0x0A,也就是使用了CR(carriage return)與LF(new line feed)為換行符號。

Linux使用的換行符號為0x0A,也就是只用了LF(new line feed)為換行符號。

這就造成了一個很有趣的現象,若使用Windows的Notepad去開啟Linux的文字檔,會發現無法換行,(因為沒有CR),而在Linux 的Gedit去開啟Windows下的文字檔卻正常,(因為有LF),但若用UltraCompare去比對2個文字檔,卻又是不同,因為 UltraCompare是用binary的方式去比較,也就是直接去比對2的檔案每個byte的值是否一樣,而不是去比較內容。

為什麼用UltraEdit開啟Linux的文字檔與Notepad開啟結果不一樣?

或許你會說,『我用UltraEdit開啟了Linux的文字檔一輩子,顯示都很正常啊,從來都沒有無法換行的問題!!』

我們來看一下UltraEdit的設定:

進階–> 組態 –> 檔案處理 –> DOS / UNIX / MAC 處理

text02

這是UltraEdit的預設值,Detect file type and prompt to change,這也是為什麼當你用UltraEdit去開啟Linux的文字檔時,都會出下類似以下的視窗

text03

不過不論你按下『是』或者『否』,顯示的結果都一樣,因為Only recognize DOS terminated lines (CR/LF) as new lines for editing預設是沒有勾選的,也就是儘管你是Linux的文字檔,最後UltraEdit還是會用Windows的文字檔方式顯示。

建議改成如下的設定:

text04

將UNIX/MAC file detection/conversion設定成none,如此將來開啟Linux文字檔就不會出現提示視窗。

勾選Only recognize DOS terminated lines (CR/LF) as new lines for editing,如此UltraEdit的顯示就會與Notepad一致,如此一看到內容不對就知道是Linux的文字檔。

如何使用UltraCompare比較Windows與Linux下所產生的文字檔?

Step 1:將Linux文字檔換行方式轉成DOS

檔案 –> 轉換 –> UNIX/MAC到DOS

text05

轉換後變成DOS格式

text06

存檔。

Step 2:使用UltraCompare去比較檔案 (略)

完整程式碼下載
simple_text_c.7z (由C產生Windows的文字檔)
simple_text_verilog.7z (由Verilog產生Linux的文字檔)

Conclusion
這是一個RTL驗證常遇到的小議題,由於對Windows與Linux文字檔格式的不了解,加上UltraEdit的設定繁雜,常常明知道結果是對的,但因為設定不對,造成使用UltaCompare比對時結果是錯誤的,特此記之。

另外還可得知,相同內容的文字檔,Windows的文字檔會與Linux的文字檔的檔案size不同,也是因為Windows使用CR與LF換行,需2個byte,Linux僅需LF換行,只需1個byte,固Linux文字檔檔案size較小。

資料來源:http://www.cnblogs.com/oomusou/archive/2011/06/15/windows_unix_text.html

2012年6 月 posted by admin in 文獻參考 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: