2016-05-13 19 views
1

私は以下のように簡単なVerilogコードを実装しようとしています:Verilogで次の再宣言エラーが発生するのはなぜですか?

module test1(
    input ACLK, 
    input RST, 
    output test_output1, 
    output test_output2 
    ); 

//wire ACLK; 
//wire RST; 
reg test_output1; 
reg test_output2; 


assign test_output1 = ACLK; 

always @(posedge ACLK or negedge RST) 
begin 
    if(!RST) 
    begin 
     //test_output1 <=0; 
     test_output2 <=0; 
    end 
    else 
    begin 
     //test_output1 <=0; 
     test_output2 <=1; 
    end 
end 


endmodule 

私はザイリンクスのISEで、それを合成しようとすると、私は、次のエラーメッセージが表示されます。

========================================================================= 
*       HDL Compilation        * 
========================================================================= 
Compiling verilog file "test1.v" in library work 
ERROR:HDLCompilers:27 - "test1.v" line 30 Illegal redeclaration of 'test_output1' 
ERROR:HDLCompilers:27 - "test1.v" line 31 Illegal redeclaration of 'test_output2` 

私は解決することができませんこのエラー。どんな助けも高く評価されます。

+1

test_output1は、レジスタとワイヤの両方として宣言されています。 – vim

答えて

1

次の変更を追加:それはタイプのワイヤである必要がありますので、割り当てる文でtest_output1を使用

  1. を。

    module test1(
        input wire ACLK, 
        input wire RST, 
        output wire test_output1, 
        output reg test_output2 
    ); 
    
  2. // reg test_output1; 
    // reg test_output2; 
    
、あなただけの暗黙的にワイヤーを指定したり、使用状況に応じてをregする必要がありますので、あなたはすでに出力として test_output1test_outpu2を宣言している、それが型ワイヤーの デフォルトであります
3

ポートリストのポートの方向を宣言する場合は、そのタイプも宣言する必要があります。これは、ANSIスタイルのヘッダーと呼ばれます。

ポートリスト、方向、およびタイプを区切る非ANSIスタイルのヘッダーもあります。 IEEE1364-1995規則を守らない場合は、ANSI以外のスタイルを使用する必要があります。タイプを宣言することはできません(output reg test_output2;は無効ですが、output test_output2; reg test_output2;は有効です)。 IEEE1364-2001のANSIと非ANSIスタイルがサポートされているため(非ANSIではoutput reg test_output2;が可能)最新のVerilogシミュレータはすべてSystemVerilog(IEEE1800)シミュレータです。したがって、設計者の選択肢になります。 (入力が少ないのでANSIスタイルが一般的です)。

ANSIスタイルヘッダー:

module test1(
    input ACLK, 
    input RST, 
    output test_output1, 
    output reg test_output2); 

非ANSIスタイルのヘッダ:

module test1(ACLK, RST, test_output1, test_output2); 
    input ACLK; 
    input RST; 
    output test_output1; 
    output test_output2; 

    reg test_output2; 

注:IEEE1364を使用すると、assign文でregを駆動することはできません、それはネット型である必要があります。 IEEE1800はregの代わりにlogicが再開されたという規則を緩和しましたが、通常はassignを使用する場合は、ネットを割り当てる必要があります(例:wire)。

関連する問題