Verilog中获取随机数

本文

主要介绍一种verilog语言中获取随机数的方法。

版本 说明
0.1 初版发布

代码展示

  • 逻辑实现
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。