【数字IC前端】学习随笔(1)——SystemVerilog数据类型

本文详细介绍了SystemVerilog中的数据类型,包括reg与线网的区别,logic和bit类型,四值逻辑与二值逻辑,有符号和无符号类型。还探讨了定宽数组、动态数组、队列、关联数组、结构体、枚举类型和字符串的使用,强调了类型转换、存储空间考量和数组操作的重要性。

Systemverilog与Verilog数据类型区分:

reg和线网(net,如wire)及logic

  • reg与wire: Verilog作为硬件描述语言,倾向于设计人员自身懂得所描述的电路中哪些变量应该被实现为寄存器,而哪些变量应该被实现为线网类型。这不但有利于后端综合工具,也更便于阅读和理解。
  • logic: SV作为侧重于验证的语言,并不十分关切logic对应的逻辑应该波综合为寄存器还是线网,因为logic被使用的场景如果是验证环境,那么它只会作为单纯的变量进行赋值操作,而这些变量也只属于软件环境构建。
  • logic被推出的另外一个原因也是为了方便验证人员驱动和连接硬件模块、而省去考虑究竟该使用reg还是wire的精力。这既节省了时间,也避免了出错的可能。

logic与bit类型

  • logic:四值逻辑,可以表示0、1、X、Z;
  • bit:二值逻辑,可以表示0、1.

四值逻辑与二值逻辑

  • 四值逻辑:integer,logic,reg,net-type(例如wire、tri)
  • 二值逻辑类型:byte,shortint,int,longint,bit

有符号和无符号

  • 有符号类型:byte,shortint,int,longint,integer
  • 无符号类型:bit,logic,reg,net-type(例如wire,tri)

习题1:

logic[7:0]logic_num = 8'b1000_0000;
bit[7:0]bit_num = 8'b1000_0000;
byte signed_num = 8'b1000_0000;
initial begin
	$display("logic_num =%d",logic_num);
	$display("bit_num = %d",bit num);
	$display("signed_num = %d",signed num);
end

打印出来的三个值分别是:128,128,-128

习题2:

byte signed_num = 8'b1000 0000; 
bit [8:0] result_num; 
    initial begin 
        result_num = signed_num;
        $display("@1 result_num = 'h%x", result_num); 
        result _num = unsigned' (signed_num); 
        display("@2 result_num = 'h&x", result_num); 
end

打印出来的两个结果分别是

`h180 
`h080

有符号数赋值给无符号数,从8位转9位,最高位先扩展一位,变成了1_1000_0000;第二个有符号数先转化为无符号数,然后赋值给无符号数,不受影响,仍然是1000_0000。

  • 上面的例子是静态转换,即需要在转换的表达式前加上单引号可,而该方式并不会对转换值做检查,如果发生转换失败,我们也无从得知。
  • 编码时一定要注意操作符左右两侧的符号类型是否一致,如果不一致,应该首先将其转换为同一类型再进行运算。
  • 与之对应的动态转换 【 $cast(tgt,src)】 也被经常运用到转换操作。
  • 静态转换和动态转换均需要操作符号或者系统函数介入,我们统称为显式转换。
  • 而不需要进行转换的一些操作,我们称之为隐式转换。

习题3:

logic [3:0] x_num `b111x;
bit [2:0] b_num;
// implicit conversion 
initial begin
    $display ("@1 x_num = 'b%b", x_num) ; 
    b_num =x_num;
    $display ("@2 b_num = 'b%b", b_num) ; 
end

这里,b_num的值打印为b’110。这里4值逻辑转2值逻辑,X和Z值转2值逻辑时,一定转化为0,而不是1。

定宽数组

数组声明

int lo_hi/015];//16 ints[0]..[15	]
int c_style[16]; //16 ints[0]..[15]

多维数组声明和使用

数组声明的标号从低号–>高号,或者从高号–>低号都ok。
(习惯从高->低)

int array2[0:7] [0:3]; //完整声明
int array3 [8][4]; //紧凑声明
array2[7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值