2016-12-07 4 views
-1

Dieses Problem machend, erhalte ich eine unerwartete Ausgabe von X (unbekannter Wert) von meinem Verilog-Code.unerwartete Ausgabe von Signalverarbeitungsstrukturmodul

Würde mich freuen, wenn mir jemand zeigen könnte, wo ich falsch liege, Code ist beigefügt.

Problem

enter image description here

Modulcode

// Signal processing structure 

module sps(in1,clk,rst,out1); 

input clk,rst; 
input signed [19:0] in1; 
output reg signed [19:0] out1; 


reg signed [19:0] w,w1; 



always @(in1 or w or w1) begin 
      w <= in1 + w1; 
      out1 <= w + ~w1; 
      end 

always @(posedge clk) begin 
    if(~rst) 
     w <= 0; 
    else begin 
     w1 <= w; 
     end  
end 


     endmodule 

Testbench Code

// test sps 

module testSps; 

reg clk,rst; 

reg [19:0] in1; 
wire [19:0] out1; 


sps sps1(in1,clk,rst,out1); 


initial 
    begin 
    rst = 0; 
    clk = 0; 
    in1 = 20'b0000000000000000001; 
    #5 rst = 1; 
    #50 $stop; 
    end 

always  
    #5 clk = ~clk; 





endmodule 
+1

Nicht zu "w" in 2 separaten immer Blöcke zuweisen. Verwende auch keine nicht blockierenden (<=) Zuweisungen in deinem 1. Immer-Block. – toolic

+0

danke @toolic schätzen die Antwort, könnten Sie eine Antwort auf die Frage geben, warum dies der Fall ist? Ich möchte das, um mehr zu verstehen, was passiert! –

Antwort

0

Wenige Beobachtungen in Ihrem Design & Testbench-Code.

  • Sie havent initialisiert das clk Signal in dem Prüfstand. Fügen Sie clk = 0 in dem Start des ersten Blocks in Ihrer Testbench hinzu.

  • Der unten Block sieht selbst aktualisieren Schleife zu mir. Denn w ist dort in der Empfindlichkeitsliste und wird auch im Block aktualisiert.

    always @(in1 or w or w1) begin 
        w <= in1 + w1; 
        out1 <= w + ~w1; 
    end 
    
  • w wird durch immer blockieren mehrere angetrieben. Ein Netz sollte nur durch Single-Always-Block gefahren werden. Sie können beide Blöcke immer kombinieren, um w wie folgt zu fahren. Vielleicht möchten Sie w1 auf 0 im 2. Immer Block setzen.