logic数据类型和reg数据类型只能受到单个驱动,而wire可以受到多个驱动。
logic明显不可综合,是SystemVerilog语法,而reg可综合。
logic和reg还有点像,都能被连续赋值,门单元赋值,还有模块驱动赋值。
比较赞同:从语义上来说,SV中的logic数据类型和Verilog中的reg类型是一样的,可以互换使用,更多的是兼容wire类型。
https://zhuanlan.zhihu.com/p/107051924
http://www.elecfans.com/bandaoti/eda/202007201248592.html
VerilogHDL语言当中,包含连续赋值、过程赋值以及过程性连续赋值这三种赋值方式。
连续赋值:有以下几个特点:
(1)含有关键字“assign”来标识;
(2)在赋值时,数据类型必须是wire线网型数据,是因为用于描述组合逻辑建模与线网数据;
(3)连续赋值语句执行时,赋值表达式当中信号变化都将立即被反映到赋值线网型数据的取值上。
而过程赋值:
(1)被赋值的数据类型必须是reg类型数据;
(2)过程性连续主要是用来描述时序逻辑电路进行行为描述;
(3)只有在过程赋值语句执行时,才能执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响。
而过程性连续赋值,
只有assign-deassign与force-release这两种过程性连续赋值。
在实现过程中,连续赋值方式和过程赋值方式相比:具有速度快、而且能节省资源(过程赋值实现是需要寄存器来辅助)。
双状态的数据类型:bit1,int32,byte8,shortint16,longint64,real双精度64(https://www.bilibili.com/read/cv12270330)
四状态是Verilog传统的reg、wire,还有SystemVerilog的logic,竟然还有time类型。(P104)
默认情况下,四状态用x作为初始,二状态用0,变量存在x或z,可以使用$isunknown函数判断。
非合并数组:普通数组,按照计算机存储方式,小于32bit的位宽类型以32bit形式存储,而longint用两个字表示。
常量数组:是普通数组的赋值过程,采用'{}的形式,其中可以添加default:x,作为未赋值的默认值x。
合并数组:是声明位宽的部分高维表示,如bti [3:0][7:0] array[3],每个array中是一个合并数组,四个字节,每个字节8位。
合并数组的值可以作为敏感信号列表(@中的值,而非合并数组不行)
合并和非合并都是定宽数组。
使用空的下标[],int d2[], d2=new[5], 赋值过程好像会自动释放内存啊
对增加和删除元素的开销较小,具有数组和链表的优点(通过索引进行访问,最大编号为)q2[]={1,2,3}
insert, delete方法
保存稀疏矩阵的元素,数或者哈希表存储形式,声明时在中括号指定位宽,bit [63:0] assoc[bit[63:0]],具有64位的寻址空间,int s[string],string作为寻址空间
first, next,delete等方法
typedef struct packed {bit [7:0] a, b, c;} pxs; 其中的abc都在同一个字中,和合并数组的存储类似。
流操作,<< >>等