1

在 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]。奇怪的是,这个问题只在我合成时出现,并且一切都很好用于模拟目的。我想知道是否有某种方法可以告诉合成器我想“强制”不改变寄存器文件的其余部分。

4

1 回答 1

3

您永远不会分配组合循环内的所有位。你有一个浮动分配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

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

于 2013-01-28T10:55:48.430 回答