2016-10-20 2 views
2

私は2つのVerilogモジュールを作成しました。最初のものは9ビットの数字をとり、最初に出現した1の位置を返します。Verilogモジュールインスタンシエーションと空のbegin end

module findPositionOf_1(
    input [8:0] data, 
    output reg [3:0] position 
); 


    always @(data) 
    begin 
    if(data==9'b0000_00000) 
     position=4'b0000; 
    else if(data[0]==1) 
     position=4'b0000; 
    else if(data[1]==1) 
     position=4'b0001; 
    else if(data[2]==1) 
     position=4'b0010; 
    else if(data[3]==1) 
     position=4'b0011; 
    else if(data[4]==1) 
     position=4'b0100; 
    else if(data[5]==1) 
     position=4'b0101; 
    else if(data[6]==1) 
     position=4'b0110; 
    else if(data[7]==1) 
     position=4'b0111; 
    else if(data[8]==1) 
     position=4'b1000; 
    end  

endmodule 

第二のモジュールは、それがゼロにそのビットを変更して、もう一度、私は次のように取得しています。1.

module findPositionOf_2nd_1(
    input [8:0] r1_data, 
    output [3:0] position1 
); 

reg [3:0] pos,pos2; 
reg [8:0] temp; 

integer i; 
always @(r1_data) 
begin 
    findPositionOf_1 f1(.data(r1_data), .position(pos)); 


    i=pos; 
    temp=r1_data; 
    temp[i]=0; 
    findPositionOf_1 f2(temp,pos2); 
    if(pos2==4'b0000) 
    position1=0; 
    else 
    position1=pos2; 

end 

endmodule 

の発生を見つける最初の最初のモジュールを呼び出している1の第2の発生を返しますコンパイル中のエラー。助けてください。

チェッカー 'findPositionOf_1'が見つかりません。インスタンス化 'f1'は、 可視チェッカーである必要があります。 開始/終了ブロックが空のボディで見つかりました。この はSystemVerilogでは使用できますが、Verilogでは使用できません。 迷惑セミコロンを探してください。

答えて

5

ところで、あなたはコードを書くことによって、どのようにしてVerilog(および他のHDL言語)が「通常の」手続き型コーディングと異なるのかを完全には理解できなかったようです。

[email protected]ブロック内のすべてが上から下に実行され、そのモジュールは機能に似ていると仮定しているようです。これはそうではありません。モジュールを設計したときにハードウェアがどのように見えるかを考える必要があります。

この場合、2つのfindPositionOf_1モジュールが必要です。あなたは、最初の(u_f1)の結果が2番目の(u_f2)の入力に影響を与えたいと思っています。これを行うには、2つのモジュールをインスタンス化し、それらのモジュール間の相互接続を決定します。

我々は、回の左シフト'1pos数(1<<pos)によって位置pos 1とベクトルを作成することができます。 XOR-INGの一緒にビットをすることで、声明r1_data^1<<posあなたが文法的に間違っている手続きブロック、ある常にブロックの内側にあなたのモジュールをインスタンス化している不要な1

module findPositionOf_2nd_1(input [8:0] r1_data, output [3:0] position1); 
wire [3:0] pos,pos2; 
wire [8:0] temp; 

    findPositionOf_1 u_f1(.data(r1_data), .position(pos)); 
    findPositionOf_1 u_f2(.data(temp), .position(pos2)); 

    assign temp = r1_data^(1<<pos); 
    assign position1 = pos2; 

endmodule 
+0

はなぜインスタンス化は常にブロックで起こることはできません役立つはずです。私はVerilogにはとても新しいです。 – panshul

1

削除します。次に、最初のモジュールを関数呼び出しとして使用しましたが、これは許可されていません。言われたように、あなたは両方のモジュールを接続してチェックできる別のテストベンチが必要です。 findPositionOf_2nd_1モジュールへの入力として、1番目の出現位置を作成します。あなたの質問のために、おそらくこれは

Why can't I instantiate inside the procedural block in Verilog

関連する問題