Verilog移位寄存器并行输入LD无法写入内部寄存器mem问题求助
故障成因
在Verilog的always块中,对同一个寄存器变量执行多次非阻塞赋值时,只有最后一次赋值会生效,前面的赋值会被直接覆盖。
当前代码的时序逻辑分支里:
- 先根据
load信号判断是否给mem赋值为LD - 后续又无条件执行
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
相关产品推荐
相关产品推荐

