我是靠谱客的博主 背后煎饼,最近开发中收集的这篇文章主要介绍[SV]SystemVerilog中队列和数组的约束和随机化 Randomize Queue and Array in SystemVerilog,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Randomize Queue and Array in SystemVerilog
前言:在大多数队列用例中,队列被用作缓冲区或临时存储。所以不需要太多的随机队列。
一、randomize queue size
在下面的例子中,队列大小将根据大小约束进行随机化,队列元素将获得随机值:
- 使用rand声明队列
- 对随机化的队列将得到随机值
class queue_rand;
rand bit [7:0] qu[$];
constraint size_c { qu.size() inside {[4:10]}; }
function void display();
$display("qu size is = %0d",qu.size());
$display("qu = %p",qu);
endfunction
endclass
program queue_randomization;
queue_rand pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
qu size is = 7
qu = '{'h88, 'h9b, 'h9a, 'h10, 'h5f, 'hde, 'h84}
二、SystemVerilog Randomize Array
大多数数组使用应用程序需要数组的随机化。数组大小和数组元素都可以随机化。
2.1、Fixed Size Array Randomization
在一个固定大小的数组中,只能对数组元素进行随机化。由于大小是固定的,所以不可能更改。
2.2、为数组元素生成随机值
在下面的示例中,将为数组元素生成随机值。
- 将数组声明为rand
- 在随机化中,数组将得到随机值
class fs_array;
rand bit [3:0] array1[4];
rand bit [7:0] array2[6];
function void display();
$display("array1 = %p",array1);
$display("array2 = %p",array2);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'he, 'h4, 'h4, 'h8}
array2 = '{'h9b, 'h9a, 'h10, 'h5f, 'hde, 'h84}
2.3、在数组中生成唯一的元素
在上面的例子中,我们已经看到了随机值的随机化。下面的例子展示了使用shuffle数组方法的唯一值的随机化。
- 约束数组的元素值与索引值相同
- 在后随机化中对数组进行洗牌,使数组不具有递增值。
class fs_array;
rand bit [7:0] array1[6];
constraint array_c { foreach(array1[i]) array1[i] == i;}
function void post_randomize();
array1.shuffle();
endfunction
function void display();
$display("array1 = %p",array1);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'h2, 'h1, 'h4, 'h0, 'h5, 'h3}
2.4、数组和约束
在下面的例子中,数组被随机化,所有元素的和等于30。
- 使用rand声明数组。
- 使用数组方法sum()约束数组的和。
class fs_array;
rand bit [7:0] array1[6];
constraint array_c { array1.sum() == 30;}
function void display();
$display("array1 = %p",array1);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'h7, 'h0, 'h17, 'h0, 'h0, 'h0}
2.5、数组元素的数组和约束
在前面的示例中,只考虑数组元素的和,数组元素可以取任何值。但是在下面的例子中,数组的和和每个元素的值都是受限的。
- 使用rand声明数组
- 使用数组方法sum()约束数组的和。
- 约束数组元素的值。
class fs_array;
rand bit [7:0] array1[6];
constraint array_c { array1.sum() == 30;}
constraint array_c_e { foreach(array1[i]) array1[i] > 2;}
function void display();
$display("array1 = %p",array1);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'h7, 'h3, 'hb, 'h3, 'h3, 'h3}
2.6、多维数组的约束
下面的示例显示了带有约束的多维数组的声明和随机化。
cclass fs_array;
rand bit [7:0] array1[3][4];
constraint array_c { foreach(array1[i,j]) array1[i][j] == i*j;}
function void display();
$display("array1 = %p",array1);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'{'h0, 'h0, 'h0, 'h0}, '{'h0, 'h1, 'h2, 'h3}, '{'h0, 'h2, 'h4, 'h6}}
2.7、一个多维数组的求和方法
在下面的例子中数组的和中,元素是受约束的。
class fs_array;
rand bit [7:0] array1[3][4];
constraint array_c { array1.sum() == 30;}
function void display();
$display("array1 = %p",array1);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
- Simulator Output
array1 = '{'{'h0, 'h0, 'h16, 'h0}, '{'h0, 'h0, 'h0, 'h0}, '{'h0, 'h0, 'h8, 'h0}}
最后
以上就是背后煎饼为你收集整理的[SV]SystemVerilog中队列和数组的约束和随机化 Randomize Queue and Array in SystemVerilog的全部内容,希望文章能够帮你解决[SV]SystemVerilog中队列和数组的约束和随机化 Randomize Queue and Array in SystemVerilog所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复