2016-10-29 6 views
0

forループを使用してリップルキャリー加算を使用して加算を実行しようとしていますが、クロックのposedgeでのみ演算を実行したかったのです。そのために、generateブロックを使用して、generateブロック内でforループを使用しました。いつものステートメントを使わないとうまくいくでしょうが、alwaysブロックを追加すると、シミュレーション時にエラーが発生します。以下 コードである:常に生成ブロック内のVerilogがエラーをスローしています

genvar i; 
generate 
    always @(posedge clk) 
    for(i=0;i<=31;i=i+1) begin : generate_block   
     fulladd f1(.sum(sum[i]),.cin(cout1[i]),.a(b[i]),.b(temp[i]),.cout(cout1[i+1])); 

    end 
    end 

endgenerate 

ここfulladd異なるモジュールです。

以下

シミュレートしたときに、私は取得していますエラーです:

Error-[IBLHS-CONST] Illegal behavioral left hand side 
    add32.v, 36 
    Constant Expression cannot be used on the left hand side of this assignment 
    The offending expression is : i 
    Source info: i = 0; 


    Error-[IBLHS-CONST] Illegal behavioral left hand side 
    add32.v, 36 
    Constant Expression cannot be used on the left hand side of this assignment 
    The offending expression is : i 
    Source info: i = (i + 1); 


    Error-[SE] Syntax error 
    Following verilog source has syntax error : 
    "add32.v", 37: token is '(' 
     fulladd 
    f1(.sum(sum[i]),.cin(cout1[i]),.a(b[i]),.b(temp[i]),.cout(cout1[i+1])); 

add32.vは、設計モジュール名です。私は概要vcsを使用しています。私はVerilogプログラミングの初心者です。私が間違っている根底にある概念について説明してください。事前に感謝

+4

alwaysブロック内ではインスタンスを使用しないでください。 – toolic

答えて

0

追加ロジック&登録信号は別々に扱われる必要があります。該当する入力&の出力信号を加算器から引き出し、posedgeで別々に登録します。

see this CLA adder implementation code for reference

私は以下のように一般的なリップルキャリー加算器を実装しています。

// ripple_carry_adder.v 
// NOTE : I have registered the outputs only. Inputs are asynchronous. 

`timescale 1ns/10 ps 
module ripple_carry_adder 
      #( parameter COUNT = 32     // width of RCA port 
      ) 
       (  
        input clk,rst,     
        input Carry_in,    
        input [COUNT-1:0] A, B, 
        output reg [COUNT-1:0] Sum, 
        output Carry_out 
       ); 

reg [COUNT-1:0] Carry,Cout; 
assign Carry_out = Cout[COUNT-1]; 

[email protected](posedge clk or posedge rst) 
begin 
    if (rst) 
     begin 
      Carry = 'b0; 
      Sum = 'b0; 
      Cout = 'b0; 
     end 
    else 
     begin 
      Cout = ((A & B) | ((A^B) & Carry)); 
      Sum  = (A^B^Carry); 
      Carry = {Cout[COUNT-1:1],Carry_in}; 
     end 
end 
endmodule 
0

なぜこの場合には常にブロックが必要なのかわかりません。あなたは時計の姿勢で何かをインスタンス化することは決してありません。

私はブロックを生成する書き込みについては行く方法は(発生なし)何のインスタンスは次のようになり最初の数字に出ている:fulladdの複数のインスタンスをインスタンス化し、これを拡張するために、

その後
fulladd f1(.sum(sum[0]),.cin(cout1[0]),.a(b[0]),.b(temp[0]),.cout(cout1[1])); 

genvar i; 
generate 
for(i=0;i<=31;i=i+1) begin : generate_block   
    fulladd f1(.sum(sum[i]),.cin(cout1[i]),.a(b[i]),.b(temp[i]),.cout(cout1[i+1])); 
end 
endgenerate 
関連する問題