2、非合并数组,位宽在后面,用于识别数组中元素个数。 3)非合并数组一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。文档实用非合并数组:字的地位存放变量,高位不用。表示方法: Bit [7:0]bytes; 4)合并数组和非合并数组的选择 (1)当需要以字节或字为单位对存储单元操作。 (2)当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。 Bit[3:0][7:0]barray[3] ;表示
3、合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组 可以使用barry[0]作敏感信号。 l 动态数组随机事物不确定大小。使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。Intdyn[]; Dyn=new[5]; //分配5个元素空间 Dyn.delete(); //释放空间l 队列在队列中增加或删除元素比较方便。文档实用l 关联数组当你需要建立一个超大容量的数组。关联数组,存放稀疏矩阵中的值。表示方法:采用在方括号中放置数据
4、类型的形式声明:Bit[63:0]assoc[bit[63:0]]; l 常量:1)Verilog推荐使用文本宏。好处:全局作用范围,且可以用于位段或类型定义缺点:当需要局部常量时,可能引起冲突。2)Parameter 作用范围仅限于单个module3)Systemverilog: 参数可以在多个模块里共同使用,可以用typedef代替单调乏味的宏。 过程语句l 可以在for循环中定义变量,作用范围仅在循环内部for(inti=0;i<10;i++)array[i]=i;文档实用 l 任务、函数及void函数1)区别:Veril
5、og中task和function最重要的区别是:task可以消耗时间而函数不能。函数中不能使用#100的延时或@的阻塞语句,也不能调用任务;Systemverilog中函数可以调用任务,但只能在fork joinnone生成的线程中。2)使用: 如果有一个不消耗时间的systemverilog任务,应该把它定义成void函数;这样它可以被任何函数或任务调用。 从最大灵活性角度考虑,所有用于调用的子程序都应该被定义成函数而非任务,以便被任何其它任务或函数调用。(因为定义成任务,函数调用任务很有限制) l 类静态变量作用:1)类的静态变量,可以被这个类的对
7、,这时数组会被复制到堆栈区,代价很高。2) 用带ref进行数组参数传递,仅仅是引用,不需要复制;向子程序传递数组时,应尽量使用ref以获得最佳性能,如果不希望子程序改变数组的值,可以使用constref。3) Ref参数,用ref传递变量;可以在任务里修改变量而且,修改结果对调用它的函数可见,相对于指针的功能。 l Return语句增加了return语句。Task任务由于发现了错误而需要提前返回,如果不这样,那么任务中剩下的语句就必须被放到一个else条件语句中。体会下Taskload_ar