RTL基本知識:VCD內部解剖
VCD(ValueChange Dump)是用ASCII記錄了被選擇信號在仿真過程中的變化情況,同時還記錄了一些測試向量生成時的仿真信息,例如仿真時間精度等.目前常用的VCD主要有兩種格式:
四值格式:記錄了信號的數值變化情況,這裏的數值僅包含0,1,x,z,不包含相關信號強度的信息;
擴展格式:記錄了信號數值變化的所有情況;
本文僅以四值格式VCD為例進行詳述.
1 VCD生成常用的系統任務
在Verilog中嘗試用以下的系統任務保存測試向量VCD.
1.1 $dumpfile
該任務主要用來指定要生成的VCD文件名.
【示例】
1.2 $dumpvars
該任務主要用來指定將那些變量的信息保存到$dumpfile指定的VCD文件中,其格式主要有兩種:一種是有參數的,一種是沒有參數的.
無參數:
該任務執行後將會將所有的變量變化情況都記錄到VCD文件中.
有參數:
該任務的第一個參數用來指定從當前層開始向下記錄多少層的模塊的信號變化情況,第二個參數指定記錄信號開始的模塊(例化名).當第一個參數設置為0時將會將指定的層以下的所有層次的信號變化情況都記錄下來,這裏需要註意,此時的參數0-只是對後續模塊參數有效,對於變量參數不影響.
【示例】僅記錄top層下的所有信號的變化情況,但是不記錄例化在top層下的所有信號的變化情況.
【示例】記錄從top層開始的所有模塊中信號的變化情況.
【示例】記錄特定模塊以下所有層信號變化情況和其他模塊變量的變化情況
記錄了top.mod1及其所有層次的信號的變化情況,同時也記錄了top.mod2.net1的變化情況,但是這裏需要註意的是,第一個參數的作用對象為模塊mod1,不是mod2.net1.
1.3 $dumpoff和$dumpon
$dumpvars調用後在調用的時間槽的最後開始記錄信號的變化情況,當時用$dumpoff時記錄掛起,此時將會產生一個記錄檢查點,檢查點中記錄的所有被選擇的變量值為x,當再次使用$dumpon後,掛起的記錄將會繼續進行,而在$dumpoff和$dumpon之間的變化將不會進行記錄,而是以x作為記錄.
【示例】
1.4 $dumpall
該任務會在VCD文件中創建一個檢查點,其中記錄了當前時刻所要記錄的信號的值,這裏需要註意,VCD記錄功能使能後,VCD僅記錄隨著時間遞增有變化的信號,如果相關的信號沒有發生變化,那麽將不會在對應時段進行記錄,但是如果使用$dumpall那麽不管當前時刻前後相關信號是否發生變化,所有要被記錄的信號都會記錄到VCD中.當該命令緊跟著$dumpvars時,將不會在VCD記錄中出現,因為此時該命令的功能與$dumpvars一致,即記錄所有要被記錄的變量信號的值.
1.5 $dumplimit
該任務可以限定VCD文件的大小,其中參數的單位為字節,當記錄的VCD文件大小達到限制,將會在文件的末尾插入如下語句表示VCD文件記錄的大小已經達到設定值:
1.6 $dumpflush
該任務主要用來清理VCD文件占用的系統緩存,當然在清理之前會將緩存中的數據保存到VCD文件中,一般情況下只有仿真結束了才能對VCD文件進行操作,在代碼中增加該任務,可以在放真的過程中對VCD文件進行操作,因為該任務在仿真過程中將緩存中的數據更新到VCD中,所以不用等到仿真結束即可查看VCD文件.
2 VCD文件格式
VCD文件通常由三部分組成:頭信息區(HeaderInformation),節點信息區(Node Information),數值變化區(Value Change).VCD文件的開始部分為頭信息區,其中包括VCD產生日期、仿真器版本以及仿真時間精度等信息.節點信息區主要記錄了哪些變量信號將被記錄在VCD中以及在VCD中對應這些變量信號的標識符(ASCII,字符的範圍從!到~,在碼表中對應的十進制數為33到126).數值變化區主要記錄了那些隨著仿真時間推移發生變化的變量信號.
註意事項:
-
VCD中記錄的數據是區分大小寫的;
-
VCD不會僅記錄一個矢量的一部分,也不會記錄表達式;
-
記錄信號的數據格式
VCD中記錄的變量一般主要包括標量和矢量,每種類型的信號被記錄在VCD中的方式也略有差異.
-
標量變量一般記錄時,標識符與具體對應數值之間沒有空格;
-
矢量變量記錄時,需要分兩種情況:
-
矢量變量每一位對應一個標識符,此時記錄的每一位與記錄標量變量一樣;
-
矢量變量整體對應一個標識符時,此時標識符與對應記錄的數值之間有一個空格,記錄數值的格式為:<進制><數字>;
一般矢量數字的格式為右對齊,可能記錄數據本身的位數與矢量定義不一致,此時會對數據的高位進行填充處理,一般遵循的高位補充規則如下表所示:
【示例】
從向量中可以看到,信號RIO2_REFCLK_M[3:0]在時刻#5000000、#6500000、#12000000分別為4‘b1111,4‘b0000,4‘b1111.這裏大家需要註意矢量變量在VCD中記錄的格式.
2.2 VCD中常見的關鍵字
在VCD文件中,常見關鍵字命令如下表所示:
2.2.1 $comment
主要是在VCD中插入一些註釋提示信息等.
2.2.2 $date
主要記錄了VCD是生成的時間.
2.2.3 $enddefinitions
標識頭信息區和節點信息區的結束.
2.2.4 $scope
主要指示被記錄變量的作用範圍,一般對於以下模塊關鍵字進行範圍標誌:module,task,function,begin(具有label),fork(具有label).
2.2.5 $timescale
指示VCD生成時使用的時間精度.
2.2.6 $upscope
指示設計層次結構的變化,主要是從當前層跳轉到比當前層更高一級的層次時使用,即表示當前層相關描述已經結束.
2.2.7 $version
指示產生VCD的仿真器的名字和版本等信息.
2.2.8 $var
指示當前標識符和信息名對應關系.
2.2.9 $dumpall
指示當前為一個檢查點,記錄了所有要被記錄的信號的值,而不管該信號是否發生變換.
2.2.10 $dumpoff
該命令後所有被記錄的信號的值為x,直到遇到$dumpon;
2.2.11 $dumpon
表示再次使能了記錄變量有效變化到VCD.
2.2.10 $dumpvars
其後緊跟著所有要被記錄的變量信號的初始值.
【示例】註意示例中各關鍵字說明
歡迎大家關註魏老師的微信公眾號:芯光燦爛
RTL基本知識:VCD內部解剖