欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Systemverilog(绿皮书)第二章——数据类型

程序员文章站 2022-05-31 17:17:25
...

在Verilog中,初学者经常分不清reg和wire两者的 区别,应该使用它们中哪个来驱动端口?连接不同模块时又该如何做?Systemverilog中对此做了改进,如图1所示:

Systemverilog(绿皮书)第二章——数据类型

图中,黄色的logic、bit、logic和reg 为 无符号类型蓝色的integer、byte、shortint、int和longint有符号类型。针对四值逻辑和二值逻辑的赋值问题,如下问题1:

logic    [7:0]    a = 8'b1000_0000;
bit      [7:0]    b = 8'b1000_0000;
byte              c = 8'b1000_0000;
initial    begin
    $display("a = %d", a);
    $display("b = %d", b);
    $display("c = %d", c);
end

打印出来的值为:128、128、-128;

解答:logic和bit 这 ;两个属于无符号数,因此a=b=128。而byte属于有符号数值,数值的首位为符号位,因此c=8'b1000_0000的值进行运算时,先对c值减1=8'b0111_1111,之后c值的各位取反c=8'1000_0000=128,此时c值为-128。

 

当两个数值的位宽不一样时,数值之间是怎么进行操作的呢?如问题2:

byte    signed_vec = 8'b1000_0000;
bit     [8:0] result_vec;
     
initial begin
         result_vec = signed_vec;
         $display("@1 result_vec = 'h%x", result_vec);
         result_vec = unsigned'(signed_vec);
         $dispaly("@2 result_vec = 'h%x", result_vec);
end
   

有符号的signed_vec自身是8位,此时如果要求赋值给无符号的9位数值result_vec,此时扩展一位signed_vec=9'b11000_0000=9'h180。

使用转换符号 ' 给转换成8位的无符号数值,再将其赋值给一个9位的无符号数值,首位填充0,此时输出为9'h080。

对于数据格式转换,如图2所示: 

Systemverilog(绿皮书)第二章——数据类型

因为四值逻辑包含了二值逻辑不具有的x和z类型,那么在进行数值转换的时候,将四值逻辑赋值给二值逻辑会有什么样的事情发生呢? 如问题3所示:

logic    [3:0] x_vec = 'b111x;
bit      [2:0] b_vec;

/implicit conversion
initial begin
    $display("@1 x_vec = 'b%b", x_vec);
    b_vec = x_vec;
    $display("@2 b_vec = 'b%b", b_vec);
end

这里无符号四值逻辑赋值给无符号二值逻辑时,由于四值逻辑是4位,二值逻辑是三位,因此四值逻辑的高位会被截断。而四值逻辑的x到了二值逻辑上为0。 

Systemverilog(绿皮书)第二章——数据类型

 

 

相关标签: IC验证