$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
相关产品推荐
相关产品推荐

