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/0:15];//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

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

被折叠的 条评论
为什么被折叠?



