当前位置:   article > 正文

[systemverilog]1_数据结构

[systemverilog]1_数据结构

1.内建数据类型
(1)logic与reg/wire区别联系
(2)logic和bit
(3)硬件世界和软件世界
(4)变量类型划分(四值/二值、有无符号)
(5)例题1
1000_0000原是代表-0,计算机中规定其代表为-128。详细可见笔记“IC_1_1”。
(6)例题2
当result_vec= signed_vec;由于result_vec为9位,所以signed_vec自动将最高位补1,表示有符号位。
(7)静态转换、动态转换、显示转换、隐式转换
静态:类型+单引号;动态:系统函数,$cast会在仿真阶段而非编译阶段返值。
(8)例题3

2.定宽数组
(1)数组的声明
(2)多维数组声明和使用
(3)初始化和赋值
注意定宽数组用的是单引号“’”;
4{8}的用法;
default:-1的用法。
(4)存储空间
根据数组是否为组合型而占用存储空间不同,以32bit为一个存储空间的话,组合型的(pack)存储是连续的,而非组合的数组中的每个组员占用一个存储空间。更详细的pack/unpack数组可参考节。
(5)例题
因为logic是四值逻辑,需要两bit的存储,所以对于pack而言,24*2=48,而24bit为一个单元,故需要两个单元;
对于unpack而言,8*2=16<24,所以还是3个单元就行。
(6)基本数组操作-for/foreach
(7)基本数组操作-复制和比较

3.动态数组
(1)数组声明和分配空间
(2)示例
new[数组宽度](数组名):将已有数组的值复制到新数组中。
sv中int默认值是0,interger默认值是X。
删除动态数组的方式(3种):dyn.delete();dyn=new[0];dyn='{};

4.队列
(1)概念
(2)示例

5.关联数组
(1)概念
(2)声明
通过方括号中放置数据类型实现 int data_as[bit [31:0]] : int为存储数据类型,bit[31:0]为寻址的类型。
(3)初始化
关联数组初始化时使用 : '{};在大括号内写入键值对的信息,键值对用:连接;
data_as = '{1:20,2:21,3:22};
(4)关联数组的大小
可以使用size()、num()来实现;没有写入数据时,大小为0。
(5)示例
中括号里面其实是索引值(idx)。
有两种方式遍历,foreach和if,其中assoc.first()返回第一个索引值,若没有数组为空,则返回0。

6.结构体
(1)概念
(2)单引号的使用
动态数组 、关联数组、结构体是分开存放的,非合并的方式都需要“‘{} ”,即需要单引号。只有组合型的数组、队列的赋值不需要单引号。
(3)如果没有typedef,结构体定义后,声明变量时只能struct pixel s1。


7.枚举类型
(1)概念
(2)
枚举类型可以赋值给整型,整型不能赋值给枚举类型。

8.字符串
(1)概念
字符串空的时候不是“\0”而是“”。
(2)$sformatf()/$sformat()
  • $sformatf(): 首先$sformatf()/$sformat()这两个函数是不做打印的事儿的!这两个函数就是整理整理字符串的格式啊!按照函数里“ ”中的格式,把相应的变量填进去。
  • $sformat ( output_var , format_string [ , list_of_arguments ] ):$sformat()比$sformatf()多了第一个参数,第一个参数就是放整理好的字符串的容器。$sformat()会直接把整理好的字符串放到第一个字符串类型的参数中。
  • $sformatf ( format_string [ , list_of_arguments ] ): 系统函数$sformatf的行为类似于$sformat,只是字符串结果作为$sformatf的函数结果值传回,而不是像$sformat那样放在第一个参数中。
(3)getc/putc/tolower/substr:

9.数组的组合型/非组合型声明(packed/unpacked用法)
(1)如果数组任一维度出现在数组名的右边,就是非组合型,否则是组合型。当某维度出现在左边,仅该维度是连续的。
reg [15:0] RAM [0:4095] //unpacked
logic a1 [7:0] [1023:0] //unpacked
wire [3:0] select //packed
logic [3:0][7:0] data //packed 也称合并数组
(2)数组维度的判断方法:
数组名同一侧(左或右):从右向左,依次是低维度高纬度。
数组名不同侧:左边低维度,右边高维度。
(3)以下例子中结构体是连续存储的,数组也是连续存储的。
(4)packed array 初始化或赋值时,只要大括号即可,无需单引号。
(5)非组合型数组无法直接赋给组合型数组,组合型数组也无法直接赋给非组合型数组。
(6)组合型数组和向量类似。

10.概念域(scope)

11.硬件过程块
(1)always
always是为了描述硬件行为,always中的@(event...)敏感列表是为了模拟硬件信号的触发行为。所以,always过程块是用来描述硬件时序电路和组合电路的,只可以在module或者interface中使用。两个always是并行执行的,同个过程块内部是串行执行。
(2)initial
initial过程块可以在module、interface和program 中使用。

12.软件方法(软件过程块)
(1)函数function
参数列表默认是input。数据变量在参数列表中可被声明ref类型。函数是不耗时的,这是与task的一个区别。
(2)任务task
task可允许事件触发 、等待事件、延迟。
function能干的,task都能干;task可以调用function,但是function不能调用task,因为task允许耗时语句。
(3)示例task
函数op_copy里t,s都是input,所以没有在退出函数时返回值给参数t。用ref,或改成output就可以了。

13.变量生命周期
(1)概述
module中的变量都是静态生命周期。automatic的用法。
(2)示例
记住static的,不会被多次初始化。
(3)规律
(4)示例
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/952452
推荐阅读
相关标签
  

闽ICP备14008679号