2016-12-30 2 views
-2

私はそれほど多くのVerilogではありません ifステートメント内のモジュールを呼び出そうとしています 私はGoogleで答えを見つけることができません。 MY CODEモジュールがVerilogの場合には

私のコードは、私が他のもの

を追加する原因私はIFを必要とする全加算器の加算 である、これは私のコードです:

module top (a,b,cin,Cout,Ctemp,sum,clk,X); 
input [3:0] a,b; 
input X; 
input cin,clk; 
output reg[3:0] sum; 
output reg[2:0] Ctemp; 
output reg Cout; 
[email protected](posedge clk) 
begin 
generate 
if (X==1) 
add bit0(a[0], b[0], cin, sum[0], Ctemp[0]); //here i need to call add module 
add bit1(a[1], b[1], Ctemp[0], sum[1], Ctemp[1]); 
add bit2(a[2], b[2], Ctemp[1], sum[2], Ctemp[2]); 
add bit3(a[3], b[3], Ctemp[2], sum[3], Cout); 
end 
endgenerate 
endmodule 

module add(a, b, cin, sum, cout); 
input a; 
input b; 
input cin; 
output sum; 
output cout; 
assign sum = (~a*~b*cin)+(~a*b*~cin)+(a*~b*~cin)+(a*b*cin); 
assign cout = (a*b)+(a*cin)+(b*cin); 
endmodule 
+1

'always'ブロック内で' generate'ブロックを使用することはできません。あなたはモジュールを "呼び出す"ことはできず、それらを "インスタンス化"し、 'always'ブロックの中でモデルをインスタンス化することはできません。 – Greg

+0

私の仕事はほとんど間違っています:/ ..ありがとう@Greg –

答えて

0

私はいくつかのヒントを与えるでしょう。モジュールのインスタンス化をalwaysブロックの外側(上または下)に移動する必要があります。次に、floppyするモジュールの出力に対して、さらにwireの宣言を追加します。モジュールのインスタンス化ポート接続を、暗黙的(接続順)ではなく明示的(名前による接続)に変更することをお勧めします。このようにしてポート順序が変わっても、接続は維持されます。多くのポートを持つモジュールには非常に便利です。 あなたのトップモジュールの本体はすべき次のようになります。

// ... 
add bit3(.a(a[3]), .b(b[3]), .cin(Ctemp[2]), .sum(pre_sum[3]), .cout(pre_cout)); 
[email protected](posedge clk) 
begin 
    if (X==1) begin 
    sum <= pre_sum; 
    Cout <= pre_cout; 
    end 
end 

その他の推奨事項:使用ANSIスタイルモジュールのヘッダー。タイピングが少なく、保守が容易です。今世紀までは、本当に古いシミュレーションにはANSI以外のスタイルが必要でした。例:

module top (
    input [3:0] a, b, 
    input  cin, 
    output reg  Cout, 
    output  [2:0] Ctemp, 
    output reg [3:0] sum, 
    input clk, 
    input X); 
関連する問題