System Verilog(1)logic 和 bit, byte, shortint, int, longint


零基礎轉驗證程序媛

  • 自學數電,verilog,刷完HDL bits
  • 看完了啟芯關於SV的系列課程
  • 接下來做一些代碼練習,寫blog記錄一下

學習資源

http:// www.chipverify.com 上的一些實例, 啟芯課程, 綠皮書

仿真工具

EDA playground

 

SV語法(1) data_type

 

 

Verilog 的數據類型主要是線網和變量,即 wire, reg, integer,都是四值邏輯(0、1、x、z)

在verilog基礎上,SV增加了二值邏輯(0、1)變量來簡化運算, 包含 bit, byte, shortint, int, longint 變量。

SV中logic與verilog中的reg變量對應,為四值邏輯的無符號數;bit為二值邏輯的無符號數;

byte, int, shortint, longint 均為二值邏輯有符號數,注意區分。

 

// 二值邏輯在驗證平台上可以簡化計算,但用在RTL邏輯綜合時容易出現問題

 

下面做一些實例,以熟悉各數據類型和相應變量的聲明語法

1. logic 變量的連續賦值和過程賦值

// logic 變量默認值為x

module tb; logic [3:0] my_data;  // declare a 4-bit logic type variable;
    logic       en;     // declare a 1-bit logic type variable; // logic變量既可以在過程語句中被賦值,也可以被連續賦值(用assign賦值)

initial begin $display ("my_data = 0x%0h en = %0b", my_data, en); // 以最小十六進制打印 my_data, 以最小十進制打印 en(默認值) my_data = 4'hB; // 過程語句中給logic變量賦值 $display ("my_data = 0x%0h en = %0b", my_data, en); // 賦值同時打印兩個logic變量 #1; // 延時1個時間單位 $display ("my_data= 0x%0h en = %0b",my_data,en); // 延時后再打印兩個logic 變量 end assign en = my_data[0]; // 連續賦值en endmodule // tb

編譯結果

# Loading sv_std.std
# Loading work.tb(fast)
# vsim -voptargs=+acc=npr
# run -all
# my_data = 0xx en = x
# my_data = 0xb en = x
# my_data= 0xb en = 1
# exit
# End time: 06:43:28 on Mar 29,2022, Elapsed time: 0:00:01
# Errors: 0, Warnings: 0
Done

2. bit 變量的賦值

 1 module tb;  2  bit var_a ;  3      bit [3:0] var_b ;  4 
 5      logic [3:0] x_val ;  6 
 7      initial begin
 8          
 9          $display("initial value var_a = %0b, var_b = 0x%0h", var_a, var_b) ; 10 
11          // 查看bit類型變量默認值,默認值都是0. var_a = 0, var_b = 0x0
12 
13          var_a= 1; 14 
15          var_b= 4'hb;
16 
17          $display("first value value var_a = %0b, var_b = 0x%0h", var_a, var_b) ; 18 
19          var_b= 16'h481a;
20 
21          $display("tructuated value: var_b= 0x%0h", var_b) ; 22 
23          // 如果賦值超過位寬會怎么樣呢? 只有最右邊的a被賦值到b變量里了 var_b = 0xa
24 
25          var_b=4'h01zx;
26 
27          $display("var_b = %b", var_b) ; 28 
29          // 四值邏輯在轉化為二值邏輯時,未知狀態x以及高阻態z都會被強制轉化為0,var_b = 0000 30 
31          // logic和bit類型都是可綜合的,但bit類型多用於testbench中
32 
33      end
34 
35 endmodule

編譯結果
# Loading sv_std.std
# Loading work.tb(fast)
#
# vsim -voptargs=+acc=npr
# run -all
# initial value var_a = 0, var_b = 0x0
# first value value var_a = 1, var_b = 0xb
# tructuated value: var_b= 0xa
# var_b = 0000
# exit
# End time: 06:51:49 on Mar 29,2022, Elapsed time: 0:00:01
# Errors: 0, Warnings: 0
Done

 

3. 有符號數 byte, int, shortint, longint 的賦值

 1 // 有符號數據類型: byte, shortint, int, longint
 2 
 3 
 4 module tb ;  5 
 6     shortint var_a;        // 16 bits
 7 
 8     int      var_b;        // 32 bits 
 9 
10     longint  var_c;        // 64 bits 
11 
12     byte     var_d;    // 8 bits -128~127
13 
14     byte unsigned var_u; // 8 bits unsigned 0~255
15   
16 
17 
18     initial begin
19         
20         $display("sizes var_a=%0d, var_b=%0d , var_c=%0d", $bits(var_a), $bits(var_b), $bits(var_c)); 21 
22         #1
23 
24         $display("default values var_a=%0h, var_b=%0h, var_c=%0h",var_a, var_b, var_c); 25 
26         #1 
27 
28         var_a = 'h7FFF ;
29 
30         var_b = 'h7FFF_FFFF ;
31 
32         var_c = 'h7FFF_FFFF_FFFF_FFFF ;
33 
34         var_d = 'h7F ; // 127
35 
36         var_u = 'h7F ; // 127
37 
38         $display("new values var_a=%0h, var_b=%0h, var_c=%0h, var_d=%0h, var_u=%0h",var_a, var_b, var_c, var_d, var_u); 39 
40         #1 
41 
42         var_a += 1 ; 43 
44         var_b += 1 ; 45 
46         var_c += 1 ; 47 
48         var_d += 1 ;    // -128
49 
50         var_u += 1 ;    // 128
51 
52 
53 
54 
55     end // initial
56 
57 
58 
59     initial begin
60 
61       $monitor("monitoring [%0t ns] var_a=%0d var_b=%0d var_c=%0d var_d=%0d var_u=%0d ", $time, var_a, var_b, var_c, var_d, var_u); 62     
63     end
64 
65 
66 
67     endmodule // tb

編譯結果
# Loading sv_std.std
# Loading work.tb(fast)
#
# vsim -voptargs=+acc=npr
# run -all
# sizes var_a=16, var_b=32 , var_c=64
# monitoring [0 ns] var_a=0 var_b=0 var_c=0 var_d=0 var_u=0
# default values var_a=0, var_b=0, var_c=0
# new values var_a=7fff, var_b=7fffffff, var_c=7fffffffffffffff, var_d=7f, var_u=7f
# monitoring [2 ns] var_a=32767 var_b=2147483647 var_c=9223372036854775807 var_d=127 var_u=127
# monitoring [3 ns] var_a=-32768 var_b=-2147483648 var_c=-9223372036854775808 var_d=-128 var_u=128
# exit
# End time: 07:05:14 on Mar 29,2022, Elapsed time: 0:00:02
# Errors: 0, Warnings: 0
Done

 


免責聲明!

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



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