那么菜 2024-03-13 19:43 采纳率: 0%
浏览 15

systemverilog中的$random%5/1000疑问

最近在使用$random系统函数的时候,遇到了点麻烦。自己写的表达式,却没有实现想要的效果。不得不拆分开了应用。
仿真代码如下:

img

我们可以看到如下结果:

img

A列结果,和B列结果,其实在逻辑上没有什么区别,传统理解上,两者可以化等式。
但是,打印结果,却差异很大。这里,暂时还没解释通,什么原因。
运算表达式为什么不能糅合在一起呢?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-13 19:44
    关注

    引自免费微信小程序:皆我百晓生

    在SystemVerilog中,$random系统函数生成一个32位的随机整数。根据你的仿真代码片段,你实际上使用的是srandom(seed)函数,并对结果取模(%操作符),然后试图除以1000得到小数结果。

    问题出在两个方面:

    1. %5/1000运算顺序:在SystemVerilog中,算术运算符的优先级规则是先进行模运算(%),再进行除法运算(/)。所以当你写下srandom(seed)%5/1000时,首先计算的是srandom(seed) % 5,这个表达式的结果是一个介于0到4之间的整数。接着将这个整数除以1000,结果通常会变成接近0的小数,因为任何非零整数除以1000都会得到一个小于1的小数。

    2. 浮点数精度问题:SystemVerilog中的实数(real)类型有一定的精度限制,在进行浮点数运算时可能不会精确表示预期的小数。此外,将一个整数除以1000后转换为实数可能会丢失部分精度,这也是造成输出结果与预期不符的原因之一。

    解决方法: 如果你希望从srandom()获取一个介于0到0.5之间(含0和0.5)的随机小数,你应该直接对srandom()的结果做适当的缩放和取模处理,例如:

    real result = srandom(seed) * (1.0 / 1000) % 0.5;
    

    这里首先将srandom(seed)的结果乘以0.001(即1/1000),然后再对0.5取模,这样可以确保得到期望范围内的随机小数。但是请注意,由于浮点运算的精度问题,实际结果可能不会严格地落在每个0.0005的边界上。如果需要更精确的控制,可能需要采用其他更为精确的随机数生成方式或额外的修正步骤。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月13日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口