system verilog中的類型轉換(type casting)、位寬轉換(size casting)和符號轉換(sign casting)


  • 類型轉換

verilog中,任何類型的任何數值都用來給任何類型賦值。verilog使用賦值語句自動將一種類型的數值轉換為另一種類型。

例如,當一個wire類型賦值給一個reg類型的變量時,wire類型的數值(包括四態數值,電平強度,多驅動解析)自動轉換為reg類型(有4態數值,但沒有電平強度和多驅動解析)。

如果一個real類型被賦值給一個reg類型的變量,浮點數值自動截取為reg字長能夠表達的整型數值。

下面這個例子里面,使用臨時變量將一個浮點類型結果轉換為一個64比特整型值,然后將這個整型值與另一個整型數據相加,結果賦值給一個64比特的reg變量。

1 reg [63:0] a, y, temp;
2 real r; 3 temp = r**3; // convert result to 64-bit integer 4 y = a + temp;

system verilog將verilog的自動轉換進行了擴展,增加了一個類型轉換操作符。類型轉換操作符允許設計者在表達式的任意一個地方指定一次類型轉換。類型轉換操作符的語法為:

type’(expression)

注意與C的類型轉換操作符不同(C中為type(expression))。

使用system verilog類型和類型轉換,上述的verilog例子可以減少使用臨時變量,具體如下:

1 longint a, y;
2 real r; 3 y = a + longint'(r**3);

 

  • 位寬轉換

在verilog中,表達式的位寬由操作數、操作符和上下文決定。system verilog也遵守同樣的規則,不過有所擴展。

system verilog允許一個表達式的位寬轉換為一個不同的位寬,可以對一個表達式或者一個操作結果進行一個明確的位寬轉換。

位寬轉換操作符的語法為:

size’(expression)

一些類型轉換的例子:

1 logic [15:0] a, b, c, sum; // 16 bits wide
2 logic carry; // 1 bit wide
3 sum = a + 16’(5); // cast operand
4 {carry,sum} = 17’(a + 3); // cast result
5 sum = a + 16’(b - 2) / c; // cast intermediate result

如果表達式被轉換為一個更小的位寬,則表達式中左邊最高位的比特被截取。如果表達式被轉換為一個較大的位寬,則表達式進行左邊位擴展:無符號數左邊擴展0,有符號數左邊擴展符號位。

這些規則與一個表達式被賦值為另一個位寬的表達式時的位寬轉換規則相同。

 

  • 符號轉換

system verilog在確定表達式結果是否有符號時,規則與verilog相同。system verilog同樣允許對一個數值進行明切的符號轉換。

符號轉換的語法如下:

1 signed’(expression)
2 unsigned’(expression)

一些符號轉換的例子如下:

1 sum = signed’(a) + signed’(a); // cast operands
2 if (unsigned'(a-b) <= 5)    // cast intermediate result
3    ......

system verilog的符號轉換操作符與verilog的系統函數$signed和$unsigned功能一樣。符號轉換是可綜合的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM