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

news/2025/1/16 2:02:37/

目录

一、枚举类型转化

二、结构体

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

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_typetypedef 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_typetypedef 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 assignmentpacked_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]);
endforeach(sum[m]) beginforeach(sum[m][n]) begin$display("sum[%0d][%0d] = 'h%0x", m, n, sum[m][n]);endend

注意: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_formatstring 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 SCOREid_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;为新添加到关联数组的值。


http://www.ppmy.cn/news/341408.html

相关文章

hbase HFile V3介绍

HBase 0.98开始增加了对cell tags的支持&#xff0c;所以其HFile结构也发生了改变。HFile V3的格式只是在V2格式后增加了标签部分。其他保持不变&#xff0c;所以对V2保持了兼容性。用户可以从V2直接切换到V3。 HFile V3主要的提高是压缩比和&#xff0c;通过把key放在一起 Val…

H3C UniServer R6900 G3 服务器介绍

一、H3C UniServer R6900 G3服务器产品概述 全新H3C UniServer R6900 G3服务器产品家族 H3C UniServer R6900 G3服务器介绍&#xff1a; H3C R6900 G3机架式服务器是自主研发的&#xff0c;基于IntelXeonScalable Processor的新一代4U机架式服务器&#xff0c;可广泛应用于新…

每个DBA都应该知道:进行数据库优化的方法

优化操作数据库及其访问应用的性能是数据库管理员&#xff08;DBA&#xff09;持续进行的挑战。当然&#xff0c;编写高效的SQL是确保数据库优化性能的最重要方面&#xff0c;但是对SQL的调整或系统的调优都无法优化针对设计不良或组织混乱的数据库运行的查询的性能。因此&…

102. 二叉树的层序遍历

2023.6.12 思路就是用队列&#xff0c;保存完一层后&#xff0c;开始取出&#xff0c;取出一个保存它的值&#xff0c;然后把它的左右孩子添加到队列的尾部&#xff0c;这样当一层的值保存完后&#xff0c;其下一层的所有节点正好全部进入队列。 # Definition for a binary tr…

回调函数排序异常原因

回调函数排序异常原因 问题所在解决方案 参考我的这篇博文c回调函数排序:回调函数 我之前的代码是这样写的:&#xff08;存在问题&#xff09; 问题所在 将数组传递到其他函数中&#xff0c;再使用sizeof(数组名)&#xff0c;得到的不是数组的完成长度了(往往会短一些) 解决…

排水管网监测,万宾排水管网在线监测系统

城市排水管网是保障城市环境卫生的重要基础设施。然而&#xff0c;传统的排水管网管理方式存在许多问题.通过排水管网在线监测系统的建设&#xff0c;可以实现对管网上窨井井盖状态、管网液位、管网流量、管网水质等数据采集&#xff0c;实时掌握排水管网运行状况&#xff0c;为…

剑指 Offer 09: 用两个栈实现队列

简单明了&#xff0c;带你直接看懂题目和例子。 输入&#xff1a; ["CQueue","appendTail","deleteHead","deleteHead"] 这里是要执行的方法&#xff0c;从左到右执行 [[],[3],[],[]]对应上面的方法&#xff0c;是上面方法的参数。CQ…

java版本工程项目管理系统源码-简洁+好用+全面-工程项目管理

​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承包企…