概述
目录
一、枚举类型转化
二、结构体
三、合并数组和非合并数组
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;为新添加到关联数组的值。
最后
以上就是震动翅膀为你收集整理的SV枚举类型转化、数组、字符串使用小结一、枚举类型转化二、结构体三、合并数组和非合并数组四、字符串string五、关联数组的全部内容,希望文章能够帮你解决SV枚举类型转化、数组、字符串使用小结一、枚举类型转化二、结构体三、合并数组和非合并数组四、字符串string五、关联数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复