You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

$urandom在BASYS3板级无输出导致状态机卡SHOT状态问题咨询

问题结论

$urandom属于Verilog仿真系统函数,仅支持仿真场景,无法被综合为硬件电路,因此板级运行时不会生效。

问题根因

  • 所有以$开头的Verilog系统函数,本质是仿真器运行在PC侧时调用的软件函数,仅用于仿真阶段的逻辑验证,逻辑综合工具不会为这类函数生成对应的硬件电路。
  • 你的代码在综合时,rd <= $urandom%20这一行会被综合工具判定为无驱动逻辑,最终rd会被固定为初始值0,因此进入SHOT状态后,rd>1的判断永远不成立,状态机就会持续停留在SHOT状态。

解决方案

你需要用可综合的硬件伪随机数生成逻辑替代$urandom,最常用的是线性反馈移位寄存器(LFSR),资源占用极低,非常适合你的需求。

你可以把原来生成rd的逻辑替换为如下7位LFSR实现:

// 替换原来的rd寄存器定义和赋值逻辑
reg [6:0] lfsr = 7'h1; // 初始值不能为全0

always @(posedge pclk or posedge rst) begin
    if(rst) begin
        lfsr <= 7'h1;
    end else begin
        // 7位LFSR特征多项式:x^7 + x^6 + 1
        lfsr <= {lfsr[5:0], lfsr[6] ^ lfsr[5]};
    end
end

// 取LFSR输出模20得到你需要的rd值
wire [6:0] rd = lfsr % 20;

额外注意点

你原代码中的组合逻辑敏感列表不全:always @(state or counter or s_time)里没有包含rd,会导致仿真和实际硬件行为可能不一致,建议直接改用always @(*)自动包含所有敏感信号。


内容的提问来源于stack exchange,提问作者Hubert Mucha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:12:01