• SV(1)- 数据类型


    1.双状态数据类型

    • sv增加了一些二值逻辑,v中只含有四值逻辑(reg,wire)
    四值逻辑:integer,logic,reg,net-type(wire,tri)
    二值逻辑:byte,shortint,int,longint,bit
    有符号类型:byte,shortint,int,longint,integer
    无符号类型:logic,reg,net-type(wire,tri),bit
    四值逻辑默认为x,二值逻辑默认为0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.定宽数组

    (1)数组的声明和初始化

    • v中必须声明下界,sv允许省略下界
    int c_style[16]; //表示[0]-[15]
    
    • 1
    • v只可以创建一维数组,sv可以创建多维数组
    int array[8][4]; //大小8行4列的二维数组
    
    • 1

    (2)常量数组的赋值

    • 赋值需要使用单引号和大括号
    int ascend[4]='{0,1,2,3};   
    int descend [5];
    desend = '{0,1,2,3,4};
    asend = '{4{8}};    //4个值都为8
    desend = '{9,8,default:1}; //{9,8,1,1,1}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (3)for和foreach

    • foreach的使用非常的方便,可以有效的简化代码
    • 注意foreach后没有封号
    //foreach对一位数组进行遍历
    int f[5];
    foreach(f[i])  //等同于for(int i=0;i<=4;i++)
    
    int a[6:2];
    foreach(a[i])  //等同于for(int i=6;i>=2;i--)
    
    //foreach对二维数组进行遍历
    int md[2][3] = '{'{0,1,2},'{3,4,5}};
    initial begin
    	foreach(md[i,j])   //foreach(md[i][j])是错误写法
    	$display("md[%0d][%0d]=%0d",i,j,md[i][j]);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (4)数组的复制与比较

    dst = src //复制非常的简单等号即可
    $display("src %s dst",(src==dst)?"==":"!=");  //?:操作等同于if...else...
    
    • 1
    • 2

    (5)同时使用数组下标和位下标

    • verilog中可以同时使用数组下标和位置下标
    initial begin 
    	bit[31:0] src[5] = '{5{5}};
    	displayb(src[0],,     //b是二进制的意思
    				src[0][0],,		
    				src[0][2:1]	//显示为‘b10,取数组的第一个的高两位,’b101的高两位为'b10
    		);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (6)合并数组
    暂时看的不明朗

    3.动态数组

    • sv提供了动态数组类型,可以在仿真时分配空间或者调整宽度,这样在仿真的时候就可以使用最小的存储量
    • 动态数组的声明使用[]的下标,这意味着数组的宽度不在编译的时候给出,而是在程序运行的时候给出
    • 讲的很玄乎,其实动态数组的意思就是空数组
    int dyn[],d2[];  //声明动态数组
    
    • 1

    4.队列

    • 队列可以在任何地方增加和删除元素
    • 队列使用[$]声明
    • 不要对队列使用构造函数new[]
    int j = 1, 
    	q2[$] = {3,4},    //队列常量不需要用“'” 
    	q[$] = {0,2,5};   //{0,2,5}
    	
    initial begin
    	q .insert(1,j);     //{0,1,2,5} 在第1元素之前插入j
    	q.insert(3,q2);  //{0,1,2,3,4,5}在第3个元素之前插入q2
    	q.delete(1);      //{0,2,3,4,5}删除第1个元素
    	
    	//下面的操作执行速度很快
    	q.pus_fornt(6);  //{6,0,2,3,4,5}在队列前面插入
    	j = q.pop_back;  //{6,0,2,3,4} j = 5
    	q.push_back(8);  //{6,0,2,3,4,8}在队列末尾插入
    	j = q.pop_front; //{0,2,3,4,8} j =6
    	foreach(q[i])
    		$display(q[i]);
    	q.delete();       //删除整个队列
    	end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 队列更倾向与直接组合的方式,例子不给了,看绿皮书一看就懂P29

    5.关联数组

    • sv提供了关联数组的类型,用来保存稀疏矩阵的元素
    • 例如只保存0…3、42、1000、4521和20000,关联数组要比定宽数组和动态数组要小的多
    • 仿真器采用树或者哈希表的形式来存放关联数组,但有一定的额外开销
    • 关联数组采用在方括号中放置数据类型的形式来声明,例如[int]或[Packet]
    initial begin 
    	bit [63:0] assoc[bit[63:0]],idx = 1;
    
    	//对稀疏分布的元素进行初始化
    	repeat(64)begin
    		assoc[idx] = idx;
    		idx = idx<<1;
    	end
    
    	//使用foreach遍历数组
    foreach(assoc[i])
    	$display("assoc[%h] = %h",i,assoc[i]);
    	
    	//使用函数遍历数组
    	if(assoc.first(idx))
    			begin
    		do
    			$display("assoc[%h] = %h",idx,assoc[idx]);
    			while(assoc.next(idx));
    	end
    	
    	//找到并删除第一个元素
    	assoc.first(idx);
    	assoc.delete(idx);
    	$display("The array now has %0d elements",assoc.num);
    end	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 这里总结一下display的用法
    - display(q[i]);
    
    - dispaly("md[%0d][%0d]=%0d",i,j,md[i][j]);
    
    - display("assoc[%h]=%h",i,assoc[i]);
    
    - displayb(src[0],,src[0][0],,src[0][2:1]);
    
    - displayh(bytes,,bytes[3],,byte[3][7]);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6.链表

    • 虽然SV提供了链表
    • 但应该避免使用它,SV使用队列更加的高效

    7.数组的方法

    • 数组包括:定宽数组,动态数组,队列,关联数组
      看不懂,暂定

    8.使用typedef创建新的类型

    • typedef可以定义新的类型,struct创建新的类型 如:
    typedef struct{bit[7:0]r,g,b;}pixel_s;
    pixel_s my_pixel;
    
    typedef struct{int a;byte b;shortint c;int d;}my_struct_s;
    
    • 1
    • 2
    • 3
    • 4

    9.枚举类型

    typedef enum {RED,BLUE,GREEN} color; //枚举类型的创建
    
    typedef enum{INIT,DECODE=2,IDLE} fsmtype_e; //指定枚举值
    
    • 1
    • 2
    • 3

    10.字符串

    string s;
    
    initial begin
    	s = "IEEE";
    	$display(s.getc());
    	$display(s.tolower());
    
    	s.putc(s.len()-1,"-");
    	s = (s,"P1800");
    
    	$display(s.substr(2,5));
    	my_log($psprintf("%s %5d",s,42));
    end
    
    task my_log (string message);
    	$display("@%0t: %s",$time,messgae);
    endtask
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    实在学不动了,下周再写

  • 相关阅读:
    时间类(Date和Time)
    安装“react-dnd”和“react-dnd-html5-backend”无法找到“react/jsx-runtime”
    景联文科技带你了解数据标注之文本标注
    IDEA 快捷键
    9.2 Plotting with pandas and seaborn(用pandas和seaborn绘图)
    C# 实战--listBox1使用
    IP地址分类及范围
    【Django笔记】5 Django模板
    LeetCode 0623.在二叉树中增加一行:DFS / BFS
    SpringBoot 入门
  • 原文地址:https://blog.csdn.net/qq_44943193/article/details/125440867