本文
主要介绍一种verilog语言中获取随机数的方法。
代码展示
1
2
3
4
5
|
function [31:0] get_random;
input signed [31:0] min_num;
input signed [31:0] max_num;
get_random = min_num + {$random}%(max_num-min_num+1);
endfunction // get_random
|
- 逻辑测试(如果范围包括负数,请将random_num声明为有符号类型)
1
2
3
4
5
6
7
8
9
10
11
12
|
reg signed random_num
initial begin
#0 begin random_num = get_random(-10,10);
$display("RANGE_NUM: %d", random_num);
end
#10 begin random_num = get_random(-10,10);
$display("RANGE_NUM: %d", random_num);
end
#20 begin random_num = get_random(-10,10);
$display("RANGE_NUM: %d", random_num);
end
end
|
应用场景
实际设计中并不会使用随机数的生成逻辑,因为本身逻辑也是非可综合的。使用随机数生成逻辑往往用于测试逻辑。典型的应用如,为时钟添加时钟偏移(多用于跨时钟域设计的验证,如异步fifo验证)。
1
2
3
4
5
6
7
8
9
10
|
parameter CLK_PERIOD = 50;
reg clk;
reg signed [31:0] random_num;
reg [31:0] clk_shift_period;
initial clk = 0;
always begin
random_num = get_random(-CLK_PERIOD/5,+CLK_PERIOD/5);//skewing 20%
clk_shift_period = CLK_PERIOD + random_num;
#clk_shift_period/2 clk = ~clk;
end
|
文章原创,可能存在部分错误,欢迎指正,联系邮箱 cao_arvin@163.com。