1

Verilog HDL では、1 ビットを変更している間、レジスタ ファイルの残りの部分が変更されないようにする方法を教えてください。次の例のように、

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 に答える