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

Verilog移位寄存器并行输入LD无法写入内部寄存器mem问题求助

故障成因

在Verilog的always块中,对同一个寄存器变量执行多次非阻塞赋值时,只有最后一次赋值会生效,前面的赋值会被直接覆盖。
当前代码的时序逻辑分支里:

  1. 先根据load信号判断是否给mem赋值为LD
  2. 后续又无条件执行case(dir)分支,再次对mem做移位赋值
    这就导致不管load是否为高,mem的最终取值永远是移位后的结果,load加载并行值的逻辑被完全覆盖,自然无法写入LD的数值。

修复方案

把移位逻辑放到load为0的分支下,保证同一时刻只有一个赋值逻辑对mem生效:当load为高时加载并行输入,当load为低时执行移位操作。修正后的模块代码如下:

module shift(
input clk,
input rstn,
input load, 
input dir,
input [7:0] LD,
output cout
);

reg [7:0] mem;

assign cout = dir ? mem[0] : mem[7] ;


always @(posedge clk or negedge rstn)
begin
 if(!rstn)
  mem <= 8'h00;
 else begin
  if(load) 
   mem <= LD ;
  else begin
    case(dir)
     0 : mem <= mem << 1 ;
     1 : mem <= mem >> 1 ;
    endcase
  end
 end
end

endmodule   

测试激励代码无需修改,重新编译运行即可正常实现并行加载+移位功能。

内容的提问来源于stack exchange,提问作者Tejas K E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:03