SV枚举类型转化、数组、字符串使用小结

目录

一、枚举类型转化

二、结构体

三、合并数组和非合并数组

1、非组合型

2、组合型

3、数组中数据查找

四、字符串string

五、关联数组


一、枚举类型转化

  •  将1转换成枚举类型st2 = state_t'(1),可以成功转换。
  •  将4转换成枚举类型st2 = state_t'(4); 超出范围,不可以转换成枚举类型,但是st1 value = 4且不报错。可以用if(!$cast(st2,4)) $error来判定。
initial begin: enum_type
  typedef enum {IDLE, START, PROC, END} state_t;
  state_t st1, st2;
  wait(b_enum_type == 1); $display("enum_type process block started");
  st1 = IDLE;
  $display("st1 value = %0d (int)", st1);
  $display("st1 value = %s (string)", st1); // implicit conversion
  $display("st1 value = %s (string)", st1.name());

  st2 = state_t'(1); 
  $display("st1 value = %0d (int)", st2);
  $display("st1 value = %s (string)", st2.name());

  st2 = state_t'(4); 
    if(!$cast(st2,4))
        $error("int 4 to state_t conversion failure")
  $display("st1 value = %0d (int)", st2);
  $display("st1 value = %s (string)", st2.name());
end

# enum_type process block started
# st1 value = 0 (int)
# st1 value = IDLE (string)
# st1 value = IDLE (string)
# st1 value = 1 (int)
# st1 value = START (string)

#int 4 to state_t conversion failure

# st1 value = 4(int)
# st1 value = (string)


二、结构体

  • 创建结构体、声明变量、初始化变量(注意单引号)
  • 结构体默认为非组合类型,需要单引号在定义的时候达到非组合赋值给非组合类型
  • %p可用于打印聚合表达式,默认打印10进制。
initial begin: struct_type
  typedef struct {
    bit[7:0] addr;
    bit[31:0] data;
    bit is_write;
    int id;
  } trans_t;             //创建结构体
  trans_t t1, t2, t3;    //声明变量
  wait(b_struct_type == 1); $display("struct_type process block started");
  t1 = '{'h10, 'h1122_3344, 'b1, 'h1000};   //初始化
  $display("t1 data content is %p", t1);


  t2.addr = 'h20;
  t2.data = 'h5566_7788;
  t2.is_write = 'b0;
  t2.id = 'h2000;
  $display("t2 data content is %p", t2);

  t3 = t2;
  t3.data = 'h99AA_BBCC;
  t3.id = 'h3000;
  $display("t3 data content is %p", t3);
  $display("t2 data content is %p", t2);
end

# struct_type process block started
# t1 data content is '{addr:16, data:287454020, is_write:1, id:4096}
# t2 data content is '{addr:32, data:1432778632, is_write:0, id:8192}
# t3 data content is '{addr:32, data:2578103244, is_write:0, id:12288}
# t2 data content is '{addr:32, data:1432778632, is_write:0, id:8192}


  • 不加单引号,定义组合类型的数组,赋值给组合类型 (packed)。此时trans_t是 bit[72:0],t1也是72位数组组合赋值。
 typedef struct packed {
    bit[7:0] addr;
    bit[31:0] data;
    bit is_write;
    int id;
  } trans_t;             //创建结构体
  trans_t t1, t2, t3;    //声明变量
  wait(b_struct_type == 1); $display("struct_type process block started");
  t1 = {8'h10, 32'h1122_3344, 1'b1, 32'h1000};   //初始化

三、合并数组和非合并数组

1、非组合型

  •   框图表示储存方式,从上到下表示0、1、2、3
  •   代码中可以进行单个空间赋值,也可以用 '{} 的形式进行非组合赋值

       

  bit [7:0] unpacked_word [3:0];

  unpacked_word[0] = 10;
  unpacked_word[1] = 32;
  unpacked_word[2] = 54;
  unpacked_word[3] = 76;
  $display("unpacked_word = %p", unpacked_word);

  // legal assignment with '{}
  unpacked_word = '{76, 54, 32, 10};
  $display("unpacked_word = %p", unpacked_word);

2、组合型

  • 框图表示储存方式,从左到右表示3、2、1、0
  • 代码中同样可以进行单个空间赋值,或者不加单引号,内部声明数据类型进行组合赋值,注意如果不声明数据位数,则每个数据默认32位,packed_word为128位,但是只保存低32位。
  • 利用左移符时不声明数据位数,因为声明之后左移会使其消失。

     

  // legal assignment
  packed_word[0] = 10;
  packed_word[1] = 32;
  packed_word[2] = 54;
  packed_word[3] = 76;
  $display("packed_word = %p", packed_word);

  // legal assignment with {} but without '
  packed_word = {8'd76, 8'd54, 8'd32, 8'd10};

  packed_word = (76<<24) + (54<<16) + (32<<8) + 10;

3、数组中数据查找

//四行,每行两个8位数据,赋值方式如下。
integer sum [4][2]; // 8*4 size array 
  sum = '{0:'{'h21, 'h43}, default:'{default:'x}};//零行有两个数据,非组合,剩余定义为 'x

//两种数值查找方式 
foreach(sum[i, j]) begin
    $display("sum[%0d][%0d] = 'h%0x", i, j, sum[i][j]);
end

foreach(sum[m]) begin
    foreach(sum[m][n]) begin
    $display("sum[%0d][%0d] = 'h%0x", m, n, sum[m][n]);
    end
 end

注意:sum [4][2]中sum [0][0]为'h21,如果是sum [3:0][1:0]排列,sum [0][0]为'h43 


四、字符串string

  • 创建字符串、初始化
  • 连接字符串的两种方式1、大括号{str , s2}; 2、s4 = $sformatf("%s to %s", s1, s2);
  • $sformatf作用是整理字符串格式。
initial begin: string_format
  string s1, s2, s3, s4;
  wait(b_string_format == 1);$display("string_format process block started");
  s1 = "Welcome";
  s2 = "www.rockeric.com";

  s3 = {s1, " to ", s2}; // concatenation operator '{...}'
  $display("s3 content: %s", s3);

  s4 = $sformatf("%s to %s", s1, s2); // system format function
  $display("s4 content: %s", s4);
end

# string_format process block started
# s3 content: Welcome to www.rockeric.com
# s4 content: Welcome to www.rockeric.com


五、关联数组

id_score1[int]中的int(也可以用其他的类型)作为index的类型,不需要连续。

int id_score1[int], id_score2[int]; // key ID, value SCORE
  id_score1[101] = 111;
  id_score1[102] = 222;
  id_score1[103] = 333;
  id_score1[104] = 444;
  id_score1[105] = 555;

  id_score2 = id_score1;
  id_score2[101] = 101;

  id_score2[112] = 102;
  id_score2[123] = 103;

注意:id_score2[101] = 101;为修改关联数组的值,id_score2[112] = 102;id_score2[123] = 103;为新添加到关联数组的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值