Verilog-Simulationsfehler, "Modul wurde bereits deklariert"

Ich verwende den Iverilog- Simulator mit einem Verilog-Beispiel für ein uart-Design mit Testbench. Wenn ich diesen Befehl ausführe,

iverilog -o a.vvp uart_tb.v uart.v  

Ich bekomme folgenden Fehler:

/uart.v:148: Modul uart2 wurde bereits hier deklariert: uart.v:1

uart.v-Code:

 module uart2 (
    reset          ,
    txclk          ,
    ld_tx_data     ,
    tx_data        ,
    tx_enable      ,
    tx_out         ,
    tx_empty       ,
    rxclk          ,
    uld_rx_data    ,
    rx_data        ,
    rx_enable      ,
    rx_in          ,
    rx_empty
    );
    // Port declarations
    input        reset          ;
    input        txclk          ;
    input        ld_tx_data     ;
    input  [7:0] tx_data        ;
    input        tx_enable      ;
    output       tx_out         ;
    output       tx_empty       ;
    input        rxclk          ;
    input        uld_rx_data    ;
    output [7:0] rx_data        ;
    input        rx_enable      ;
    input        rx_in          ;
    output       rx_empty       ;

    // Internal Variables 
    reg [7:0]    tx_reg         ;
    reg          tx_empty       ;
    reg          tx_over_run    ;
    reg [3:0]    tx_cnt         ;
    reg          tx_out         ;
    reg [7:0]    rx_reg         ;
    reg [7:0]    rx_data        ;
    reg [3:0]    rx_sample_cnt  ;
    reg [3:0]    rx_cnt         ;  
    reg          rx_frame_err   ;
    reg          rx_over_run    ;
    reg          rx_empty       ;
    reg          rx_d1          ;
    reg          rx_d2          ;
    reg          rx_busy        ;

    // UART RX Logic
    always @ (posedge rxclk or posedge reset)
    if (reset) begin
      rx_reg        <= 0; 
      rx_data       <= 0;
      rx_sample_cnt <= 0;
      rx_cnt        <= 0;
      rx_frame_err  <= 0;
      rx_over_run   <= 0;
      rx_empty      <= 1;
      rx_d1         <= 1;
      rx_d2         <= 1;
      rx_busy       <= 0;
    end else begin
      // Synchronize the asynch signal
      rx_d1 <= rx_in;
      rx_d2 <= rx_d1;
      // Uload the rx data
      if (uld_rx_data) begin
        rx_data  <= rx_reg;
        rx_empty <= 1;
      end
      // Receive data only when rx is enabled
      if (rx_enable) begin
        // Check if just received start of frame
        if (!rx_busy && !rx_d2) begin
          rx_busy       <= 1;
          rx_sample_cnt <= 1;
          rx_cnt        <= 0;
        end
        // Start of frame detected, Proceed with rest of data
        if (rx_busy) begin
           rx_sample_cnt <= rx_sample_cnt + 1;
           // Logic to sample at middle of data
           if (rx_sample_cnt == 7) begin
              if ((rx_d2 == 1) && (rx_cnt == 0)) begin
                rx_busy <= 0;
              end else begin
                rx_cnt <= rx_cnt + 1; 
                // Start storing the rx data
                if (rx_cnt > 0 && rx_cnt < 9) begin
                  rx_reg[rx_cnt - 1] <= rx_d2;
                end
                if (rx_cnt == 9) begin
                   rx_busy <= 0;
                   // Check if End of frame received correctly
                   if (rx_d2 == 0) begin
                     rx_frame_err <= 1;
                   end else begin
                     rx_empty     <= 0;
                     rx_frame_err <= 0;
                     // Check if last rx data was not unloaded,
                     rx_over_run  <= (rx_empty) ? 0 : 1;
                   end
                end
              end
           end 
        end 
      end
      if (!rx_enable) begin
        rx_busy <= 0;
      end
    end

    // UART TX Logic
    always @ (posedge txclk or posedge reset)
    if (reset) begin
      tx_reg        <= 0;
      tx_empty      <= 1;
      tx_over_run   <= 0;
      tx_out        <= 1;
      tx_cnt        <= 0;
    end else begin
       if (ld_tx_data) begin
          if (!tx_empty) begin
            tx_over_run <= 0;
          end else begin
            tx_reg   <= tx_data;
            tx_empty <= 0;
          end
       end
       if (tx_enable && !tx_empty) begin
         tx_cnt <= tx_cnt + 1;
         if (tx_cnt == 0) begin
           tx_out <= 0;
         end
         if (tx_cnt > 0 && tx_cnt < 9) begin
            tx_out <= tx_reg[tx_cnt -1];
         end
         if (tx_cnt == 9) begin
           tx_out <= 1;
           tx_cnt <= 0;
           tx_empty <= 1;
         end
       end
       if (!tx_enable) begin
         tx_cnt <= 0;
       end
    end

    endmodule

uart.tb-Code:

`include "uart.v"
module top();

wire       reset          ;
wire       ld_tx_data     ;
wire [7:0] tx_data        ;
wire       tx_enable      ;
wire       tx_out         ;
wire       tx_empty       ;
wire       uld_rx_data    ;
wire [7:0] rx_data        ;
wire       rx_enable      ;
wire       rx_in          ;
wire       rx_empty       ;
wire       loopback       ; 
wire       rx_tb_in       ;
reg        txclk          ;
reg        rxclk          ;

uart_ports ports (
  .reset         (reset       ),
  .txclk         (txclk       ),
  .ld_tx_data    (ld_tx_data  ),
  .tx_data       (tx_data     ),
  .tx_enable     (tx_enable   ),
  .tx_out        (tx_out      ),
  .tx_empty      (tx_empty    ),
  .rxclk         (rxclk       ),
  .uld_rx_data   (uld_rx_data ),
  .rx_data       (rx_data     ),
  .rx_enable     (rx_enable   ),
  .rx_in         (rx_in       ),
  .rx_empty      (rx_empty    ),
  .loopback      (loopback    ) 
);

uart_top tbtop(ports);

initial begin
  $dumpfile("uart.vcd");
  $dumpvars();
  txclk       = 0;
  rxclk       = 0;
end
// Loopback control logic
assign rx_in = (loopback) ? tx_out : rx_tb_in;
// RX and TX Clock generation
always #1 rxclk = ~rxclk;
always #16 txclk = ~txclk;

// DUT Connected here
uart U (
.reset          (reset),
.txclk          (txclk),
.ld_tx_data     (ld_tx_data),
.tx_data        (tx_data),
.tx_enable      (tx_enable),
.tx_out         (tx_out),
.tx_empty       (tx_empty),
.rxclk          (rxclk),
.uld_rx_data    (uld_rx_data),
.rx_data        (rx_data),
.rx_enable      (rx_enable),
.rx_in          (rx_in),
.rx_empty       (rx_empty)
);

endmodule

Ich habe keinen Fehler in diesem Code gefunden. Ich bin noch ein Anfänger in Verilog und kann nicht weiter debuggen. Der Quellcode wurde von asic-world übernommen .

Haben Sie versucht, den Namen des Moduls zu ändern? Vielleicht existiert bereits etwas mit diesem Namen in Ihrer Bibliothek. Vielleicht [Ihre Initialen]_uart
@echad: Ja, ich hatte versucht, den Modulnamen in xyz_uart2 zu ändern, aber dann ändert sich der Fehler in „/uart.v:148: Modul xyz_uart2 wurde hier bereits deklariert: uart.v:1“
Ihr Always-Block sollte seinen Inhalt mit einem Begin-End-Paar verschachteln.

Antworten (1)

Die Testbench für das Design hat die folgende Zeile

`include "uart.v"

Diese Zeile weist das Programm an, diese Datei zu lesen, da sie für die Testbench erforderlich ist. Allerdings geben Sie in Ihrem Befehl auch an, dass diese Datei gelesen werden soll.

iverilog -o a.vvp uart_tb.v uart.v  

Die Datei uart.v wird zweimal gelesen, dh alle enthaltenen Module werden zweimal gelesen. Der Fehler tritt auf, weil Sie das Modul zweimal gelesen haben. Entfernen Sie entweder uart.v aus dem Befehl oder entfernen Sie die Include-Anweisung in der Testbench.

Ich hatte die vorgeschlagene Option ausprobiert, aber das Problem besteht mit weiteren Fehlern. Ich hatte beide Optionen ausprobiert, dh entweder uart_tb.v:20 entfernt include uart.v from uart_tb.v or removing uart.v from command line but in both cases, this error comes : Fehler: Unbekannter Modultyp: uart_ports uart_tb.v:37: Fehler: Unbekannter Modultyp: uart_top 3 Fehler bei der Ausarbeitung. *** Diese Module fehlten: uart_ports 1 Mal referenziert. uart_top 1 mal referenziert.`
Dies ist ein anderer, unabhängiger Fehler. Entweder stimmen die Modulnamen nicht überein, oder Ihnen fehlen einige Dateien.
Bitte laden Sie alle zugehörigen Dateien herunter und legen Sie sie im selben Verzeichnis ab. asic-world.com/examples/systemverilog/uart.html
@tra1s: Ich habe andere 2 Dateien heruntergeladen, die von uart_tb.v benötigt wurden, dh uart_ports.cv und uart_cb.sv, ich finde nicht, dass andere Dateien erforderlich sind. Jetzt erhalte ich einen anderen Fehler in uart_pots.sv , uart_ports.sv:4: syntax errorseiner Schnittstelle uart_ports() ;, ich habe keinen Syntaxfehler in dieser Datei gefunden.
In uart_ports.sv, Zeile 4, gibt es ein SystemVerilog-Schlüsselwort, "interface". Das von Ihnen verwendete Simulationstool kompiliert nur IEEE-1364 (Verilog-95). Beachten Sie, dass die Dateiendung sv für SystemVerilog steht.
@tra1s: Das bedeutet, dass es sich um eine Einschränkung von Iverilog handelt, obwohl ich immer die neueste Version von Verilog mit dem Flag -g<feature> verwenden kann, aber kein System-Verilog-Schlüsselwort verwenden kann.
@shailendra, Eigentlich lese ich auf Wikipedia: "Es unterstützt die Versionen 1995, 2001 und 2005 des Standards, Teile von SystemVerilog", also gibt es vielleicht eine Option für SystemVerilog. Wenn Sie auf ein anderes Problem stoßen, das Sie nicht überwinden können (nach erheblichem Aufwand), können Sie eine neue Frage stellen. Ansonsten denke ich, dass Ihre ursprüngliche Frage beantwortet wurde.