Verilog/SystemVerilog 里面的随机函数
Verilog系统自带一些随机数发生函数。最常用的有random。语法如下:
$random(seed);
指定概率分布
如果希望生成的随机数具有一定的概率分布,还有一些系统函数可以选用。
简单的语法如下:
$dist_uniform (seed, start, end) ;
$dist_normal (seed, mean, standard_deviation) ;
$dist_exponential (seed, mean) ;
$dist_poisson (seed, mean) ;
$dist_chi_square (seed, degree_of_freedom) ;
$dist_t (seed, degree_of_freedom) ;
$dist_erlang (seed, k_stage, mean) ;
生成一定范围的随机数实例
parameter MAX_NUM = 512;
parameter MIN_NUM = 256;
reg [15:0] num_range1, num_range2, num_range3 ;
always@(posedge clk) begin
//产生的随机数范围为 -511 ~ 511, ±(MAX_NUM-1)
num_range1 <= $random() % MAX_NUM;
//产生的随机数范围为 0 ~ 511, (0 ~ MAX_NUM-1)
num_range2 <= {$random()} % MAX_NUM;
//产生的随机数范围为 MIN_NUM ~ MAX_NUM,包含边界
num_range3 <= MIN_NUM + {$random()} % (MAX_NUM-MIN_NUM+1);
end
systemverilog里的随机数生成
obj.randomize & std::randomize
- obj.randomize():是类的随机化方法,用于随机化类成员变量。
- std::randomize():是作用域内的随机化方法,可以用于随机化函数内的变量。
例如:
program automatic test;
class pkt;
logic [15:0] pkt_size;
function new();
pkt_size = 100;
endfunction: new
function logic [7:0] get_num();
logic [7:0] scope_var;
// When this function is called, randomize class
// member var 'pkt_size' using the class's
// in-built randomize method
randomize(pkt_size);
// Using SV std lib's scope randomize this
// function's local'scope_var'
std::randomize(scope_var);
$display("pkt.get_num: pkt_size %0d scope_var %0d",
pkt_size, scope_var);
endfunction: get_num
endclass: pkt
initial begin
pkt p;
p = new();
p.get_num();
end
endprogram
systemverilog 里面的随机数概率控制
sv通过约束(constraint)来实现概率分布控制。例如:
randomize(pkt_size) with {
pkt_size inside {[10:50]};
};
// Using SV std lib's scope randomize
std::randomize(scope_var) with {
scope_var inside {10, 20, 30};
};
如何控制种子
- 直接法:
用设置种子的函数/方法。
p.srandom(seed)
- 间接法:
在仿真工具的命令行里面设置
# Synopsys-VCS
% ./simv +ntb_random_seed=10
# Mentor-Questa
% vsim -c test -sv_seed 10 -do "run -all"
参考文献:
https://www.systemverilog.io/randomization#id-1c
https://www.runoob/w3cnote/verilog2-random.html
更多推荐
verilog/systemverilog的随机数生成问题
发布评论