3

for ループは正常に動作していますが、すべてが 1 クロック サイクルで行われています。サイクルごとに1回の反復を実行するにはどうすればよいですか?

   `timescale 1ns/10ps
    module multiplier (clock,multiplier,multiplicand,start,done,product);

    input   [7:0]   multiplier ,multiplicand;
    input           start;
    input           clock;
    output  [15:0]  product;
    output          done;

    reg     [15:0]  multiplierF ,multiplicandF;
    reg     [15:0]  productF;
    reg             doneF;

    integer i;

    assign product  =   productF;
    assign done     =   doneF;

    task rpa_16;

    input   [15:0]      multiplierF;
    inout   [15:0]      productF;

    assign productF = multiplierF + productF;

    endtask

    always @ (posedge clock or posedge start)
    begin
    if(start)
        begin
            multiplierF     =   0 ;
            multiplicandF   =   0 ;
            productF        =   0 ;
            doneF           =   0 ;
        end
    else
        begin
            multiplierF     =   {8'b0,multiplier};
            multiplicandF    =   {8'b0,multiplicand};  
        end        
    end


    always @(posedge clk)
    begin
            if(!doneF)
                begin
                    for (i=0;i<7;i=i+1)
                        begin
                            if(multiplicand[i])
                                begin
                                rpa_16(multiplierF,productF); 
                                multiplierF =  multiplierF << 1;
                                productF     = productF;                       
                                end
                            else
                                begin
                                multiplierF = multiplierF << 1;
                                end
                        end
                    doneF = 1;
                end
    end
4

1 に答える 1

4

波形の画像を貼り付けることはできませんが、正のエッジごとにインクリメントしたいと思います。しかし、何が起こっているのかというと、for ループは 1 クロック サイクルで実行され、出力が得られます。

for ループは、Verilog ではシーケンシャルを意味しません。8 クロック サイクルかかるループが必要な場合は、次のような明示的なカウンター変数でループを書き直す必要があります。

always @(posedge clk or negedge reset_)
if(!reset_) begin
   multiplierF <= 0;
   loopcount   <= 0;
   doneF       <= 0;
end else begin
  if(!doneF) begin
     loopcount <= loopcount + 1;
     if(multiplicand[loopcount]) begin
       rpa_16(multiplierF,productF); 
       multiplierF =  multiplierF << 1;
       productF    = productF;                       
     end else begin
       multiplierF = multiplierF << 1;
     end
  end
  if(loopcount == 7) doneF <= 1;
end

また、複数の always ブロックのように変数を割り当てないでくださいmultiplierF。非決定的な動作が発生し、合成に失敗する可能性があります。posedge clk では両方のブロックが実行され、どちらが最後に実行されるかがわからないため、異なるシミュレーターでは異なる結果になる可能性があります。

于 2013-04-09T05:01:00.467 に答える