赞
踩
数据类型
l 合并数组和非合并数组
1)合并数组:
存储方式是连续的,中间没有闲置空间。例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。
表示方法:数组大小和位,必须在变量名前指定,数组大小必须是[msb:lsb] ;如 Bit [3:0] [7:0] bytes ;
2)二维数组和合并数组识别:
合并数组: bit [3:0] [7:0] arrys; 大小在变量名前面放得,且降序
二维数组: int arrays[0:7] [0:3] ; 大小在变量名后面放得,可降序可升序
位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。
3)非合并数组
一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。非合并数组:字的地位存放变量,高位不用。
表示方法:Bit [7:0] bytes;
4)合并数组和非合并数组的选择
(1)当需要以字节或字为单位对存储单元操作。
(2)当需要等待数组中变化的,则必须使用合并数组。
例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。
Bit[3:0] [7:0] barray[3] ; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组
可以使用barry[0]作敏感信号。
l 动态数组
随机事物不确定大小。
使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。
int dyn[];
dyn = new[5]; //分配5个元素空间
dyn.delete() ; //释放空间
l 队列
在队列中增加或删除元素比较方便。
l 关联数组
当你需要建立一个超大容量的数组。关联数组,存放稀疏矩阵中的值。
表示方法:采用在方括号中放置数据类型的形式声明:
Bit[63:0] assoc[bit[63:0]];
l 常量:
1 ) Verilog 推荐使用文本宏。
好处:全局作用范围,且可以用于位段或类型定义
缺点:当需要局部常量时,可能引起冲突。
2 ) Parameter
作用范围仅限于单个module
3 ) Systemverilog:
参数可以在多个模块里共同使用,可以用typedef 代替单调乏味的宏。
过程语句
l 可以在for循环中定义变量,作用范围仅在循环内部
for(int i=0;i<10;i++)
array[i] =i;
l 任务、函数及void函数
1 ) 区别:(这个任务和函数的区别也是面试经常会被问到的基础,所以请参考本网站Verilog HDL 任务和函数的区别与联系)
Verilog中task 和function最重要的区别是:task可以消耗时间而function不能。函数中不能使用#100的延时或@的阻塞语句,也不能调用任务;
Systemverilog中函数可以调用任务,但只能在fork join_none生成的线程中。
2 ) 使用:
如果有一个不消耗时间的systemverilog任务,应该把它定义成void函数;这样它可以被任何函数或任务调用。
从最大灵活性角度考虑,所有用于调用的子程序都应该被定义成函数而非任务,以便被任何其它任务或函数调用。(因为定义成任务,函数调用任务很有限制)
l 类静态变量
作用:
1 ) 类的静态变量,可以被这个类的对象实例所共享。
当你想使用全局变量的时候,应该先想到创建一个类的静态变量
静态变量在声明的时候初始化。
2 ) 类的每一个实例都需要从同一个对象获取信息。
l 静态方法
作用:当静态变量很多的时候,操作它们的代码是一个很大的程序,可以用在类中创建一个静态方法读写静态变量,但是静态方法不能读写非静态变量。
l ref高级的参数类型
ref 参数传递为引用而不是复制。ref比 input 、output、inout更好用。
Function void print_checksum(const ref bit [31:0] a[ ]);
1 )也可以不用ref进行数组参数传递,这时数组会被复制到堆栈区,代价很高。
2 )用带ref 进行数组参数传递,仅仅是引用,不需要复制;向子程序传递数组时,应尽量使用ref以获得最佳性能,如果不希望子程序改变
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。