3

for 循环工作正常,但一切都在一个时钟周期内发生。我如何让它每个周期运行一次迭代?

   `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循环在一个时钟周期内执行,我得到了输出。

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

此外,您不应该像multiplierF在多个 always 块中那样分配变量,您将获得不确定的行为并且可能无法合成。在 posedge clk 上,两个块都会执行,你不知道哪个块会最后执行,所以它可能在不同的模拟器上给出不同的结果。

于 2013-04-09T05:01:00.467 回答