SystemVerilog笔记------散记

来源:互联网 发布:ubuntu dd iso 安装盘 编辑:程序博客网 时间:2024/05/18 02:37

 

枚举类型打印,使用%s   ---- a.name()
 
task mytask1 (output int x, input logic y);    ...endtasktask mytask2;    output x;    input y;    int x;    logic y;    ...endtask

每一个形式参数可以具有下列之一的方向:

input   // 在开始的时候拷贝值output  // 在结束的时候拷贝值inout   // 在开始的时候拷贝,在结束的时候输出ref     // 传递引用(参见10.4.2节
const ref (只读类引用)
压缩数组不允许bit选取赋值
非压缩数组赋值可以采用变量选取
OOP中,父类的句柄是可以直接指向子类的对象空间的;当(1)把已经指向子类对象空间的父类句柄再转给子类句柄,
或者(2)把子类对象赋给指向子类空间的父类句柄时,就需要使用cast。 
不论是使用$cast还是,直接赋值,不允许纯父类向纯子类,$cast(目标,源)
在SystemVerilog中,未被限定的类属性和方法是公共的,它们对访问对象名字的任何人都是有效的。 
 
一个被标识成local的成员仅对类内的方法有效。而且这些本地成员在子类内是不可见得。
当然,访问本地类属性或方法的非本地方法可以被继承,并且作为子类的方法它可以正确地工作。 ///local 只能类的本地函数访问
 
除了可以被继承以及对子类可见外,一个被标识成protected的类属性或方法具有本地成员的所有特性。 ///protected 只能父类、子类的函数访问
 
定义时  protected/local  +  int/bit   + unsigned

压缩数组可以仅由单位整数数据类型(bitlogicregwire以及其他线网类型)组成,也可以由其它能够递归成单位整数类型的压缩数组和压缩结构体组成。 

 

具有预定义宽度的整数类型不能声明成压缩数组。这些类型是:byteshortingintlongint、以及integer

非压缩数组 int temp[8][65] 与 int temp[0:7][0:64]相同
但是bit[3:0][4:0]temp是压缩,但是bit temp[4][5]是非压缩 
\w包括_数字和字母。 子程序需要访问父程序需要通过指针访问。区别点在于加上“\”传递引用,用于保持数据的一致性。而对于数组输入时,可以通过“$”先将数组名指针取下,之后通过@$进行访问。
命名规则:

【类的成员】

TColor meBgColor; //背景颜色      member

【函数参数】

TColor eBgColor; //背景颜色       正常使用

【全局变量】

TColor geBgColor; //背景颜色      global

【局部变量】

TColor e_bg_color; //背景颜色     下划线表示为局部变量

1、当一个命名中有多个标志时,标志按以下顺序排列:【全局变量标志/类的成员函数标志 + 数据类型标志 + 指针/数组类型标志】

unsigned char *gucpPktBuf; //全局的报文数据缓冲区指针

int miMACPktLen; //MAC报文的长度,类的成员

2、所有的类成员名、函数的输入/输出参数、全局变量的命名遵循单词首字母大写(标志小写)的命名方法,
对于专有名称或缩略语,应全部大写,如CPU、MAC不能写成Cpu、Mac;

3、所有的局部变量(包括临时变量)均采用驼峰命名法,即各个单词(包括前面的标志)之间使用下划线“_”隔开,并且所有单词小写,

对于专有名称或缩略语,应全部小写,如CPUMAC只能写成cpumac

4C++模板编程中的容器类的对象命名和一般的对象命名有所区别,在命名上要体现出容器类型和容器元素类型,

如:vector<int> veci_fsn;中的名称veci_fsnvec表示vector容器,i表示元素为int类型;

同样map<int, string> mapis_port_name;中的名称mapis_port_namemap表示map容器,i表示keyint类型,s表示值为string类型;

 

const修饰指针或者地址,可以有效防止函数内对输入原数据的修改

当使用const修饰函数时,指的是函数修改到数据成员,或者引用其他非常量函数。

 

位流操作:

 

 

流操作符决定了数据位流化的顺序:>>使得数据以从左到右的顺序位流化,而<<使得数据以从右到左的顺序位流化。如果指定了slice-size(分片尺寸),那么数据首先被分割成具有特定位数目的分片,然后这些分片以特定的顺序位流化。如果没有指定slice-size,那么缺省尺寸为1(或bit)。如果分片的时候最后一个分片小于设定的分片宽度,那么不会添加填充位。 

 

例如:

Copy Code
int j = {"A", "B", "C", "D"};{>> {j}}               // 产生流 "A" "B" "C" "D"{<< byte{j}}           // 产生流 "D" "C" "B" "A" (小字节顺序){<< 16{j}}             // 产生流 "C" "D" "A" "B"{<< {8'b0011_0101}}    // 产生流 'b1010_1100 (位反转){<< 4{6'b11_0101}}     // 产生流 'b0101_11{>> 4{6'b11_0101}}     // 产生流 'b1101_01 (相同){<< 2{{<< {4'b1101}}}} // 产生流 'b1110

流操作符直接操作于integral类型和流。当应用于非压缩集合类型(例如非压缩数组、非压缩结构体、或类)的时候,它们会以深度最先的顺序递归地遍历数据直到得到单个integral类型。一个多维压缩数组会被当作单个integral类型,然而压缩条目的非压缩数组会使得每一个压缩条目被单独位流化。流操作符只能处理位流类型,处理任何其它类型都会产生一个错误。 

 

压缩操作的结果可以直接赋值到任何位流类型的变量。如果赋值左侧代表一个固定尺寸的变量并且流尺寸大于变量的尺寸,那么会产生一个错误。如果变量的尺寸大于流尺寸,那么流会向左调整并在右侧填充0。如果左侧代表一个动态尺寸的变量(例如队列或动态数组),那么变量会重新调整尺寸以便容纳整个流。如果调整后的变量尺寸大于流的尺寸,那么流会向左调整并在右侧填充0。流不是一个integral类型的值;为了在表达式中使用,需要一个强制类型转换。 

 

解压缩操作在右侧可以接受任何位流类型,包括一个流。右侧的数据可以具有比解压缩操作所能容纳的位数更多的位数。然而,如果需要的位数比右侧表达式所能提供的位数更多的话,则会产生一个错误。 

 

例如:

Copy Code
int a, b, c;logic [10:0] up[3:0];logic [11:1] p1, p2, p3, p4;bit [96:1] y = {>>{a, b, c}};  // 正确:压缩a, b, cint j = {>>{a, b, c}};         // 错误:j具有32位 < 96位bit [99:0] d = {>>{a, b, c}};  // 正确:d被填充4位{>>{a, b, c}} = 23'b1;         // 错误:流中的位数太少{>>{a, b, c}} = 96'b1;         // 正确:解压缩后a = 0, b = 0, c = 1{>>{a, b, c}} = 100'b1;        // 正确:结果与上一个例子相同(有四位未读){>>{p1, p2, p3, p4}} = up;     // 正确:解压缩后 p1 = up[3], p2 = up[2],                               //                p3 = up[1], p4 = up[0]