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

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

图中,黄色的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所示: 

因为四值逻辑包含了二值逻辑不具有的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。 

发布了14 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Jay_who/article/details/105230693