System verilog 数据类型(draft)

1 篇文章 0 订阅
1 篇文章 0 订阅

分类

按照四值逻辑和二值逻辑进行区分:

四值逻辑:integer、reg、logic、net-type(例如wire、tri)

二值逻辑:byte、shortint、int、longint、bit

按照有无符号进行区分:

有符号:byte、shortint、int、longint、integer

无符号:bit、logic、reg、net-type(例如wire、tri)

练习部分

练习1.1(主要是为区分有无符号)

module datatype_1;
    logic [7:0] logic_vector = 8'b1000_0000;
    bit   [7:0] bit_vector = 8'b1000_0000;
    byte signed_vector = 8'b1000_0000;

    initial begin
        $display("logic_vector = %d", logic_vector);
        $display("bit_vector = %d", bit_vector);
        $display("signed_vector = %d", signed_vector);
    end

endmodule

结果如下

练习1.2(有符号变量和无符号变量混用的运算)

module datatype_2;
    byte signed_vector = 8'b1000_0000;
    bit [8:0] result_vector;

    initial begin
        result_vector = signed_vector;
        $display("@1 result_vector = 'h%x",result_vector);
        result_vector = unsigned'(signed_vector);
        $display("@2 result_vector = 'h%x",result_vector);
    end
endmodule

结果如下:

练习1.3(四值逻辑给二值逻辑赋值时,X会变成0,二值逻辑如果位宽大,则高位补零)

module datatype_3;
    logic [3:0] x_vector = 4'b111x;
    bit   [2:0] bit_vector_1;
    bit   [3:0] bit_vector_2;  
    bit   [4:0] bit_vector_3;
    initial begin
        $display("@1 x_vector = 'b%b",x_vector);
        $display("-------------------------------");
        bit_vector_1 = x_vector;
        $display("@2 bit_vector_1 = 'b%b",bit_vector_1);
        $display("-------------------------------");
        bit_vector_2 = x_vector;
        $display("@2 bit_vector_2 = 'b%b",bit_vector_2);
        $display("-------------------------------");
        bit_vector_3 = x_vector;
        $display("@2 bit_vector_3 = 'b%b",bit_vector_3);
    end
endmodule

结果如下:

数组

定宽数组

int lo_hi[0:15];        //16个整数[0][1][2]............[15]

int c_style[16];        //16个整数[0][1][2]............[15]

多维数组

int array[0:1][0:2];        //完整声明

int array[2][3]='{{0,1,2},{3,4,5}}        //紧凑声明并初始化

注:如果在初始化钱,访问数组成员,logic会返回X值,int或bit会返回0值;

练习1.4

module array1;
    int lo_hi [0:15];
    int lo_style [16];
    int array[0:1][0:2] = '{{0,1,2},{3,4,5}};
    int array1[2][3] = '{{0,1,2},{3,4,5}};


    initial begin
        $display("@1----%b",lo_hi[1]);
        $display("@2----",lo_style);
        $display("@3----%p",array);
        $display("@4----%b",array1[0][2]);
        $display("@5----%0d",array1[0][2]);
    end
endmodule

%p:打印聚合表达式,例如解压缩模式,例如数组、结构体等。

SystemVerilog中指定打印格式_verilog打印-CSDN博客

结果如下:

合并数组

有时需要把数据当作一个整体来访问,同时又可以把它分解成更小的单元,此时就要引入合

并数组。如一个32bit的寄存器,有时看成48bit的数据,有时看成一个无符号数据。

bit [3:0][7:0] bytes;        // 4个字节组装成32bit

bytes=32'haabb_ccdd;

$display ("%h" ,bytes);        // 所有32bit, 即 32'haabb_ccdd;

$display ("%h" ,bytes[3]);        // 最高byte, 即 8'haa

$display ("%b" ,bytes[3][7]);        // 最高bit位,即 8'haa=8'b1010_1010 

非合并数组

不需要把数据当作一个整体来访问.

bit [7:0] b_unpack[3];        //3个字节

练习1.5
module array2;
    bit [3:0][7:0] bytes;
    bit [7:0] b_unpack [3];

    initial begin
        bytes = 32'haabb_ccdd;
        b_unpack[0] = 32'haa;
        b_unpack[1] =  8'hcc;
        b_unpack[2] = 8'hbb;
        $display("-------------------");
        $display("%p",bytes);
        $display("%h",bytes);
        $display("%h",bytes[3]);
        $display("%b",bytes[3][7]);
        $display("-------------------");
        $display("%p",b_unpack);
        $display("%h",b_unpack[0]);
        $display("%h",b_unpack[1]);
        $display("%h",b_unpack[2]);
        $display("-------------------");
        $display("%h",b_unpack[0][2]);
        $display("%h",b_unpack[1][4]);
        $display("%h",b_unpack[2][3]);
    end
endmodule

结果如下:

动态数组:

在程序执行之前不知道数组宽度,可以用[ ]留空来定义动态数组。此时数组最开始是空的,但在调用之前,必须用new[]来指定宽度。

int dyn[], d2[]; //声明动态数组

Initial begin

dyn=new[5]; // 分配5个元素

dyn='{0,1,2,3,4}; // 对元素进行初始化

d2=dyn; //复制一个动态数组

d2[0]=5; //更改元素的值

dyn=new[20](dyn); //分配20个整数值并进行复制, 把新的数组的开始5个数用旧的元素覆盖

dyn=new[100]; //分配100个新的元素, 旧值不复存在

dyn.delete(); //删除所有元素

end

队列

SV引入一个新的数据类型,它结合了链表和数组的优点,可以在队列中的任何地方添加或者删除元素;

队列的声明使用[$],元素的编号从0$;

int j=1,

q2[$]={3,4},

q[$]={0,2,5}; //声明队列,并初始化一些元素

Initial begin

q.insert(1, j); // q队列的第二个元素(排列位置从0开始数)之前插入j,

// 队列q变成{0,1,2,5}

q.insert(3,q2[0]); //q队列的第四个元素(排列位置从0开始数)之前

q.insert(4,q2[1]); // 插入队列q2的元素,队列q变成{0,1,2,3,4,5}

$display(q);

q.delete(1); //删除第1个元素(排列位置从0开始数), 队列变成{0,2,3,4,5}

q.push_front(6); //在队列前插入6, q队列变成{6,0,2,3,4,5}

j = q.pop_back; //把最后一个元素pop出来,赋值给j, j=5, q队列变成{6,0,2,3,4}

q.push_back(8); //在队列尾部插入8, q队列变成{6,0,2,3,4,8}

j = q.pop_front; //把第一个元素pop出来,赋值给j, j=6, q队列变成{0,2,3,4,8}

foreach (q[i])

$display(q[i]); //打印整个队列

q.delete(); //删除整个队列

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值