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

  • 類型轉換

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

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

若是一個real類型被賦值給一個reg類型的變量,浮點數值自動截取爲reg字長可以表達的整型數值。函數

下面這個例子裏面,使用臨時變量將一個浮點類型結果轉換爲一個64比特整型值,而後將這個整型值與另外一個整型數據相加,結果賦值給一個64比特的reg變量。spa

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))。code

使用system verilog類型和類型轉換,上述的verilog例子能夠減小使用臨時變量,具體以下:blog

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

 

  • 位寬轉換

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

system verilog容許一個表達式的位寬轉換爲一個不一樣的位寬,能夠對一個表達式或者一個操做結果進行一個明確的位寬轉換。io

位寬轉換操做符的語法爲:ast

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功能同樣。符號轉換是可綜合的。

相關文章
相關標籤/搜索