(筆記) 如何比較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所產生的文字檔
使用UltraEdit去開啟Verilog所產生的文字檔
比較兩者的差異,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 處理
這是UltraEdit的預設值,Detect file type and prompt to change,這也是為什麼當你用UltraEdit去開啟Linux的文字檔時,都會出下類似以下的視窗
不過不論你按下『是』或者『否』,顯示的結果都一樣,因為Only recognize DOS terminated lines (CR/LF) as new lines for editing預設是沒有勾選的,也就是儘管你是Linux的文字檔,最後UltraEdit還是會用Windows的文字檔方式顯示。
建議改成如下的設定:
將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
轉換後變成DOS格式
存檔。
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較小。
全文完。