SystemVerilog中$dist_uniform生成固定值而非随机数问题求助
问题解决:$dist_uniform生成固定值的原因及修正方法
你遇到的问题是因为**$dist_uniform的第一个参数使用错误**,它需要一个可修改的整数变量来保存随机数生成器的状态,而不是常数。
错误原因
$dist_uniform的语法规则是:
$dist_uniform(rand_state, min_val, max_val)
rand_state:必须是整数变量,函数会通过它维护随机状态,每次调用后自动更新该变量的值,确保下一次生成不同的随机数。- 若直接传入常数(比如你代码里的10),每次调用都会重置随机状态,导致生成的随机数固定不变(通常是传入的
min_val,也就是你看到的20)。
而$random内部维护了全局随机状态,不需要显式传递状态变量,所以每次调用都能生成不同的值。
修正后的代码示例
// 先声明并初始化随机状态变量 integer rand_seed = 10; integer rand; integer rand_test; // 在循环内调用: rand = $dist_uniform(rand_seed, 20, 25); rand_test = $random;
额外说明
- 如果使用SystemVerilog,更推荐使用类的
randomize()方法或者$urandom/$urandom_range,这些函数用法更直观,也更符合现代验证流程。 - 注意:Quartus在综合时会忽略这些系统随机函数(硬件无法直接生成随机数,需用专门的硬件随机模块),只有在仿真阶段(ModelSim/Questa)才会生效。
内容的提问来源于stack exchange,提问作者shlopkin
相关产品推荐
相关产品推荐

