2016-05-13 21 views
1

Ich versuche, einen einfachen Verilog-Code wie unten zu implementieren:Warum tritt in Verilog der folgende Fehler bei der erneuten Deklaration auf?

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 

ich die folgende Fehlermeldung erhalten, wenn ich versuche, es in Xilinx ISE zu synthetisieren:

========================================================================= 
*       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` 

Ich bin nicht in der Lage zu lösen dieser Fehler. Jede Hilfe würde sehr geschätzt werden.

+1

test_output1 wurde sowohl als Register als auch als Draht deklariert. – vim

Antwort

1

Add folgende Änderung:

  1. Sie verwendet test_output1 in assign-Anweisung, so dass es vom Typ Draht sein sollte.

    module test1(
        input wire ACLK, 
        input wire RST, 
        output wire test_output1, 
        output reg test_output2 
    ); 
    
  2. Sie haben bereits test_output1 und test_outpu2 als Ausgabe erklärt, und es ist von Standards vom Typ Draht, so dass Sie nur implizit Draht angeben müssen oder die Verwendung reg nach,

    // reg test_output1; 
    // reg test_output2; 
    
3

Wenn Sie die Richtung des Ports in der Portliste angeben, müssen Sie auch den Typ deklarieren. Dies wird als ANSI-Style-Header bezeichnet.

Es gibt auch einen Nicht-ANSI-Stil-Header, der die Portliste, Richtung und Typ trennt. Wenn Sie die IEEE1364-1995-Konvention einhalten, müssen Sie den Nicht-ANSI-Stil verwenden, und Sie können den Typ nicht deklarieren (z. B. output reg test_output2; ist ungültig, während output test_output2; reg test_output2; zulässig ist). Seit IEEE1364-2001 ANSI-und Nicht-ANSI-Stil wird unterstützt (und die Nicht-ANSI ermöglicht output reg test_output2;). Alle modernen Verilog-Simulatoren sind SystemVerilog (IEEE1800) -Simulatoren, daher haben die Entwickler die Wahl. (ANSI-Stil ist beliebter, da er weniger tippt).

ANSI-Stil-Header:

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

Nicht-ANSI-Stil-Header:

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

    reg test_output2; 

Hinweis: Bei IEEE1364, können Sie keine reg mit einer assign Anweisung fahren, muss es ein Netto-Typ sein . IEEE1800 hat die Regel weicher gemacht, es wird logic anstelle von reg, aber im Allgemeinen, wenn Sie assign verwenden, dann sollten Sie ein Netz zuweisen (z. B. wire).