在Modelsim中设计测试平台用例时,如果用到随机数作为输入信号时可以使用$random和$srandom两个函数实现。
$random
在 Verilog 中,`$random` 是一个系统函数,用于生成伪随机数。当你在仿真中需要随机值时,这个函数非常有用,比如在测试基准中模拟随机的输入信号或者在模型中创建随机的行为`$random` 函数返回一个 32 位的有符号整数,每次调用都会返回一个新的随机数。如果你需要一个特定范围内的随机数,你可以通过对 `$random` 的返回值进行适当的数学操作来实现。
例如,如果你想要一个 0 到 255 范围内的随机数,你可以这样写:
reg [7:0] random_value;
initial begin
random_value = $random % 256;
end
在上面的代码中,`$random` 返回一个随机整数,然后使用取模运算符 `%` 来限制这个数在 0 到 255 的范围内。
需要注意的是,`$random` 函数生成的随机数序列在每次仿真运行时都是相同的,除非你使用 `$srandom` 函数来设置一个新的随机数种子。通过设置不同的种子,你可以确保每次仿真时都会产生不同的随机数序列。
$srandom
`$srandom` 是一个与 `$random` 相关的系统任务,用于设置随机数生成器的种子。通过设置种子,你可以控制随机数序列的开始点,这在需要可重复的随机数序列时非常有用。
例如,设置随机数种子的代码如下:
initial begin
$srandom(seed);
end
在这里,`seed` 是一个你提供的用于初始化随机数生成器的值。如果你希望每次仿真都有不同的随机数序列,可以使用当前时间作为种子:
initial begin
$srandom($time);
end
这样,每次仿真开始时,由于 `$time` 返回的是仿真时间,它通常会不同,从而导致随机数生成器产生不同的随机数序列。
综合例程
在下面的例子中,我们首先使用 `$srandom` 设置了随机数生成器的种子为1234,然后我们三次调用 `$random` 来生成随机数。在重新设置种子后,我们再次生成了一个随机数,你会发现这个数和第一次生成的随机数是相同的,因为随机数序列是从相同的种子开始的。
module testbench;
reg [31:0] random_number;
initial begin
// 设置随机数生成器的种子
$srandom(1234);
// 生成一个随机数并打印
random_number = $random;
$display("Random Number: %d", random_number);
// 再次生成一个随机数并打印
random_number = $random;
$display("Random Number: %d", random_number);
// 如果不设置新的种子,将继续生成随机序列中的下一个数
random_number = $random;
$display("Random Number: %d", random_number);
// 重新设置种子,随机数序列将重新开始
$srandom(1234);
random_number = $random;
$display("Random Number: %d", random_number);
end
endmodule