0

デザインに基づいて乗数を書き込もうとしています。これは2つの16ビット入力で構成され、1つの加算器を使用して部分積を計算します。一方の入力のLSBはもう一方の入力の16ビットとAND演算され、ANDゲートの出力は前の出力に繰り返し加算されます。そのためのVerilogコードは以下のとおりですが、出力を機能させるのに問題があるようです。

module datapath(output reg [31:15]p_high,
                output reg [14:0]p_low,
                input [15:0]x, y,
                input clk); // reset, start, x_ce, y_ce, y_load_en, p_reset, 
               //output done);

reg [15:0]q0;
reg [15:0]q1;
reg [15:0]and_output;
reg [16:0]sum, prev_sum; 
reg d_in;
reg [3:0] count_er;

initial
 begin
      count_er <= 0;
      sum <= 17'b0;
      prev_sum <= 17'b0;
 end

always@(posedge clk)
begin
        q0 <= y;
        q1 <= x;
        and_output <= q0[count_er] & q1;
        sum <= and_output + prev_sum;    
        prev_sum <= sum;
        p_high <= sum;
        d_in <= p_high[15];
        p_low[14] <= d_in;
        p_low <= p_low >> 1;
        count_er <= count_er + 1;
 end
 endmodule

ここに画像の説明を入力してください 回路をテストするためのテストベンチを作成しましたが、最初に目にする問題は、AND演算が期待どおりに機能しないことです。xオペランドの16ビットは、yオペランドのLSBと一致します。yオペランドは、クロックサイクルごとに1ビットずつシフトされ、部分積を連続して加算して最終積が計算されます。

ただし、sum行とprev_sum行から開始するのに問題があり、それらの出力はxxxxxxxxxxxxとして表示されています。

4

2 に答える 2

1

必要なすべてのシグナルを適切にリセットしていないように見えるか、ノンブロッキング割り当てが機能する方法を混乱させているようです。

最初の開始後:

  • sumは 0 です
  • prev_sumは 0 です
  • and_outputXです

最初の正のエッジの後:

  • sumは X でand_outputあり、X は X であり、X+0 は X を返します。この時点で、X + 何かが常に X であるため、合計は X のままです。

デザイン内のほぼすべての信号に対してレジスタを作成しています。つまり、信号がすぐに更新されることはありません。登録したい信号と単なる組み合わせ項の信号を区別する必要があります。のノンブロッキング ステートメントでレジスタを更新しposedge clock、組み合わせ項をブロックに配置してすぐに更新しalways @*ます。

あなたが使おうとしているアルゴリズムがわからないので、どの行がどれであるべきかはわかりませんが、x/yに伝搬するのに 1 クロック サイクルかかりq0/q1qに伝播しand_output、さらに別のクロック サイクルからand_outputsum に伝播します。


更新されたコードに関するコメント:

  • 組み合わせブロックでは、非ブロッキング割り当てではなく、ブロッキング割り当てを使用する必要があります。always @* ブロック内の=代わりに使用します。<=
  • sum <= and_output + sum;間違っているように見えsum = and_output + p_high[31:16]ます。
  • ここで p_low[14] を 2 回割り当てています。2 番目のステートメントでビット [13:0] のみを明示的に設定します。

    p_low[14]   <= d_in;
    p_low[13:0] <= p_low >> 1;
    
于 2013-03-23T01:43:18.927 に答える
0

同じシーケンシャル ブロック内でブロック割り当てと非ブロック割り当てを混在させているalwaysため、予期しない結果が生じる可能性があります。

d_in <= p_high[15];
p_low[14] = d_in;
于 2013-03-23T00:01:22.620 に答える