三态逻辑 - 在Verilog中,如何在修改单个位的同时"hold"寄存器其余部分的值?



在Verilog HDL中,如何在修改单个位时强制寄存器文件的其余部分保持不变?如以下示例所示,

reg [31:0] result;
reg [31:0] next_result;
reg [4:0] count;
wire done;
//some code here...
result <= 32'b0;
always @* begin
if(done==1'b1) begin
  next_result[count] <= 1'b1;
end
end
always @(posedge clock) begin
result <= next_result;
//the rest of the sequential part, in which count increments...
end

事实证明,经过几个周期后,结果包含大量x(未知)值,这意味着在我修改result[count]时寄存器文件保持不变。奇怪的是,这个问题只在我合成时出现,对于模拟目的来说一切都很好。我想知道是否有某种方法可以告诉合成器我想"强制执行"不更改寄存器文件的其余部分。

你永远不会分配组合循环中的所有位。 你有一个浮动赋值result <= 32'b0; 我很惊讶这能编译。还有一个隐含的锁存,即在 else 语句中没有分配next_result,即当 done=0 时next_result将保持其值。

尝试:

always @* begin
  if(done==1'b1) begin
    next_result        = result;
    next_result[count] = 1'b1;
  end
  else begin
    next_result        = result;
  end
end

always @* begin
  next_result = result;
  if(done==1'b1) begin
    next_result[count] = 1'b1;
  end
end

您还在组合循环中使用了非阻塞<=赋值。

相关内容

  • 没有找到相关文章

最新更新