【轉載】System_Verilog列印格式

mushiheng發表於2020-12-28

system_verilog display format

1. 簡介

  • $display 和 $write的區別:
    • $display系的系統函式:會在輸出的末尾自動新增換行符(newline character);
    • $write系的系統函式:游標會停留在輸出的末尾,不會自動換行。
  • $display 和 $write相同之處:
    • 按照引數列表的順序輸出引數;
    • 引數可以是引號內的字串(quoted string literal),表示式(expression) 和數值(value);
    • 未指定輸出格式的 string 和未壓縮的 byte 資料型別,將按照字串型別輸出;
    • 其他未指定輸出格式的資料類型別是非法的。
  • 未指定 轉義字元 輸出特殊字元和特殊格式時,$dispaly 和 $write 的輸出型別預設為 string。

2. 轉義字元 (Escape sequences)

轉義字元可以分為以下三類:

  • ’ \ ’ 表示其後跟隨:文字或者不可列印字元(Literal or Nonprintable Character);
  • ’ % ’ 表示其後跟隨:格式規範,為後續引數指定格式(Format Specification);
  • ’ %% ’ 表示其後跟隨:%字元 (percent sign character).

2.1 轉義字元 ‘\’

Escaped SequenceCharacter Produced by Escaped Sequence
\nnewline character -> 換行符
\ttab character -> 製表符
\\\ character -> 反斜槓
\"“ character -> 引號
\vvertical tab -> 縱向製表符
\fform feed -> 換頁符
\aBell -> 響鈴
%%% character -> 百分號
\ddd(1)三位八進位制指定的字元,0 ≤ d ≤ 7; (2)字元少於3位,輸出非八進位制數字; (3)大於\377出錯;
\xdd兩位十六進位制數字指定的字元,0 ≤ d ≤ F

注意: system_verilog中僅包含以上幾種型別的轉義字元(IEEE Std 1800TM-2017),未出現於上表中的其他型別將輸出原來字元。如轉義字元’ \b ‘的輸出結果為‘ b ’。這與 c 語言中不同, c 語言中的 ‘ \b ’為退格,而SV中為字元’ b '.

轉義字元 >> 輸出示例:

2.2 格式說明符 ‘%’

2.2.1 整型資料格式

ArgumentDescription
%h or %Hhexadecimal -> 十六進位制
%d or %Ddecimal -> 十進位制
%o or %Ooctal -> 八進位制
%b or %Bbinary->二進位制
%c or %CASCII -> ASCII碼
%l or %LLibrary binding information -> 庫索引
%t or %Ttime->時間
%u or %Uunformatted 2 value data ->二值型別
%z or %Zunformatted 4 value data ->四值型別
%v or %Vnet signal strength -> 線網型訊號強度
%m or %Mhierarchical name -> 層次名
%p or %Passignment pattern ->
%s or %Sstring -> 字串
  • ‘%h’ ~ ‘%z’ 將整形資料顯示為對應格式,應用比較常見,此處不再贅述;
  • ‘%l’ 可以顯示既定module的library資訊,如果某module例化自library0,例化名稱為module1,那麼最終的列印資訊格式為“ library0.module1 ” ;
  • ‘%t’ 根據不同module的時間精度(precision)和時間單元(unit)顯示的格式可能不同;
  • ‘%u’ ‘%z’ 常用於$fwrite函式,用於向檔案寫入資料;其中%u不區分’x’和’z’資料,並將其對映為’0’;%z嚴格區分x和’z’資料,將其分別對映為’x’,‘z’。

2.2.2 實數顯示格式

ArgumentDescription
%e or %Eexponential -> 指數型
%f or %Fdecimal ->十進位制
%g or %Gexponential or decimal (shorter one)

數字型別 >> 輸出示例:
在這裡插入圖片描述

2.3 資料顯示尺寸

  • 對錶達式引數而言,寫入輸出檔案的尺寸是自動調整的。例如:12 bit的資料在以 ‘hex’ 格式輸出的時候自動調整為3個字元長度,以 ‘decimal’ 格式輸出的時候,自動調整為4個字元長度,因為引數輸出的最大值為FFF(hexadecimal)和4095(decimal)。
  • 預設設定:以十進位制顯示的資料格式,引數首部的 ‘0’(leading zeros)會被自動替換成空格(space);對其他格式而言,leading zeros 正常顯示;ps:如上圖第一行列印資訊。
  • 可以在%和字母之間插入域寬(field width),改寫顯示的格式。注意:域寬只能是非負十進位制整型常亮(non-negative decimal integer constant) ;
    • field width == 0 : 以最小位寬顯示,去除首部的空格和0;
    • field width == others :以others的值顯示位寬,不去除首部的空格和0;
      • argument width < others: 向左擴充套件,增加位寬至others;(arguments 值靠在右側)
      • argument width > others: 顯示完整資料位寬(> others);
      • decimal & string 向左擴充套件時,補空格 ’ '(space),其他格式,補充 ‘0’.

數字尺寸 >> 輸出示例:
在這裡插入圖片描述

2.4 ‘x’ & ‘z’ 態資料顯示

  • 十進位制 顯示規則 (decimal specification)
    • 全部 bits 為 ‘x’ 態 : 單個小寫 ‘x’ (single lowercase x);
    • 全部 bits 為 ‘z’ 態:單個小寫 ‘z’ (single lowercase z);
    • 部分 bits 為 ‘x’ 態:單個大寫 ‘X’ (single uppercase X);
    • 部分 bits 為 ‘z’ 態:單個大寫 ‘Z’ (single uppercase Z);
    • 部分 bits 為 ‘x’ 態 & 部分 bits 為 ‘z’ 態:單個大寫 ‘X’ (single uppercase X); (x takes precedence over z)
  • 十六進位制/八進位制 顯示規則 (hexadecimal/octal specification)
    • 每 4 bits 為一組,對映 hex 的一位;每 3 bits 為一組,對映 octal 的一位; (single digit)
    • 某組內全部 bits 為 ‘x’ 態 : 單個小寫 ‘x’ (single lowercase x);
    • 某組內全部 bits 為 ‘z’ 態:單個小寫 ‘z’ (single lowercase z);
    • 某組內部分 bits 為 ‘x’ 態:單個大寫 ‘X’ (single uppercase X);
    • 某組內部分 bits 為 ‘z’ 態:單個大寫 ‘Z’ (single uppercase Z);
    • 某組內部分 bits 為 ‘x’ 態 & 部分 bits 為 ‘z’ 態:單個大寫 ‘X’ (single uppercase X); (x takes precedence over z)
  • 二進位制 顯示規則 (binary specification)
    • each bit 分別顯示為 ‘0’ ‘1’ ‘x’ ‘z’;

‘x’ & ‘z’ 態 >> 輸出示例:
在這裡插入圖片描述

2.5 強度顯示格式

  • %v or %V 格式定義用於顯示 標量線網型資料 的強度。
  • 標量線網型資料顯示為三個字元(3-character),前兩個表示強度(strength character),第三個代表引數當前的邏輯值(current logic character);
  • 邏輯字元和強度字元的可選範圍如表2.5.1 和表2.5.2所示:

Table 2.5.1 Logic value of scalar nets

ArgumentsDescription
0value 0 -> 邏輯0
1value 1 -> 邏輯1
Xunknown value -> 不定值 ‘x’
Zhigh-impedance -> 高阻 ‘z’
L0 or high-impedance -> 0 或 ‘z’
H1 or high-impedance -> 1 或 ‘z’

Table 2.5.2 Strength of scalar nets

MnemonicsStrength nameStrength levels
SuSupply drive7
StStrong drive6
PuPull drive5
LaLarge capacitor4
Weweak drive3
MeMedium capacitor2
SmSmall capacitor1
HiHigh-impedance0

表2.5.2中定義了 4 種驅動強度和 3 種電荷儲存強度:驅動強度與 gate output 和 continuous assignment有關;電荷儲存強度用於 trireg 型別 net. (see clause 28 gate-level and switch-level modeling)

那麼邏輯字元和強度字元如何配合使用呢?

  • 對邏輯 ‘0’ 和 ‘1’ :

    • 訊號強度為定值時,使用助記符(mnemonic)表示強度字元;
    • 訊號強度為區間時,使用兩位10進位制數字表示強度字元範圍(strength level中的等級,0~7);
  • 對不定值’x’ :

    • 訊號強度和邏輯’0’ & '1’相同時,使用助記符(mnemonic)表示強度字元;
    • 訊號強度和邏輯’0’ & '1’相同時,使用兩位10進位制數字分別表示邏輯 ‘0’ 和 ‘1’ 的強度(strength level中的等級);
  • 對於高阻態’z’

    • 只能採用 0 等級的Hi,表示高阻 ‘z’ 態的訊號強度;
  • 對於 L 和 H:

    • 只能使用助記符(mnemonic)表示訊號強度;

    訊號強度 >> 輸出示例:

    在這裡插入圖片描述

2.6 層次名格式 (Hierarchical name)

  • %m or %M 不接受引數輸入。 相反,它使設計元素,子例程,命名塊或標記語句的層次結構名稱,該語句呼叫包含格式說明符的系統任務。 當某模組的許多例項呼叫系統任務時,%m可以指示具體哪個例項呼叫次任務。

2.7 Assignment pattern format

  • %p or %P 格式說明符可用於列印聚合表示式,例如解壓縮結構,陣列和聯合(unpacked structure,array,unions).
  • 對於解壓縮的資料結構,遍歷搜尋該結構並列印找到的單值資料型別(single data type),單值型別資料的輸出需要遵循以下要求:
    • 列舉型別:顯示列舉型別的name (其值在enum型別的有效範圍內),否則顯示value;
    • 字串:顯示為雙引號內的字串形式(quoted string);
    • 各種控制程式碼:顯示預設格式名字,如果為空控制程式碼顯示 null;
    • 其他格式:按照未定義的預設格式顯示。
  • %0p 格式說明符使得unpacked structure,array,unions可以以更短的形式顯示列印;
  • %p 和 %0p 也可以用於列印單值表示式,此時顯示結果和上述的幾種顯示格式相同。

Assignment pattern format >> 輸出格式:
在這裡插入圖片描述

2.8 字串格式

  • %s or %S 格式說明符用於將ASCII程式碼以字元樣式列印。
  • 對於出現在字串中的每個%s,相應的引數應遵循引數列表中的字串定義。
  • 相關引數被對映為一個8位十六進位制ASCII碼序列,每8位代表一個字元。
  • 如果引數是變數,則其值是右對齊的,以便該值的最右邊的位是字串中最後一個字元的LSB。
  • 字串末尾不需要終止字元或值,並且永遠不會列印前導零(leading zeros)。
  • 列印字串時,一般使用%s即可滿足要求,可以列印出全部字元。

>> IEEE Standard for SystemVerilog - Unified Hardware Design, Specification and Verification Language, 1800TM-2017
>> clause 21 Input/output system tasks and system functions

轉載請註明出處!

相關文章