2016-11-22 1 views
0

Immer wenn ich eine Testbench für meinen Systemverilogcode schreibe, scheint die Ausgabe immer X zu sein, obwohl die Implementierung korrekt ist. Wo ist mein Fehler?Ausgabe ist immer X

`timescale 1ns/1ps 

module fsm(input logic clk, input logic reset, 

input logic start, clockwise, 
output logic [3:0] pattern); 
parameter  A=4'b1100, 
       B=4'b0110, 
       Ab=4'b0011, 
       Bb=4'b1001; 
typedef enum logic [1:0] {S0,S1,S2,S3} statetype; 

statetype state, nextstate; 

//state register 
[email protected] (posedge clk) 
begin 
if (reset) 
    state= S0; 
else 
    state = nextstate; 
end 
//nextstate logic 
always_comb 
    case(state) 
    S0: if(start==1 && clockwise==0) 
      nextstate<= S3; 
     else if(start==1&&clockwise==1) 
      nextstate<=S1; 
     else 
      nextstate<=S0; 
    S1: if(start==1 && clockwise==0) 
      nextstate<= S0; 
     else if(start==1&&clockwise==1) 
      nextstate<=S2; 
     else 
      nextstate<=S1; 
    S2: if(start==1 && clockwise==0) 
      nextstate<= S1; 
     else if(start==1&&clockwise==1) 
      nextstate<=S3; 
     else 
      nextstate<=S2; 
    S3: if(start==1 && clockwise==0) 
      nextstate<= S2; 
     else if(start==1&&clockwise==1) 
      nextstate<=S0; 
     else 
      nextstate<=S3; 
    endcase 
//output logic 
[email protected] (posedge clk) 
    case(state) 
     S0: pattern= A; 
     S1: pattern= B; 
     S2: pattern= Ab; 
     S3: pattern= Bb; 
    endcase 
endmodule 

und hier ist meine Testbench

module fsmtest(); 
logic clk, reset, clockwise, start; 
logic [3:0] pattern; 
fsm dut(clk, reset, start, clockwise, pattern); 
//generate clock 
always 
    begin 
     clk=0; #5; clk=1; #5; 
    end 
initial 
    begin 
     reset=0; 
     start=1; 
     clockwise=1; 
     #10; 
     start=0; 
     #10; 
    end 
endmodule 

Ich bin nicht sicher, ob es meine Finite-State-Maschine, die falsch ist, oder wenn es die Testbank. Ich hoffe auf Hilfe, danke im Voraus.

+3

Sie haben Ihre Blockierung/Nicht-Blockierung durcheinander gebracht. Combinational ('always_comb' /' always @ * ') sollte blockieren (' = '). Sequential ('@ (posedge clk)') sollte nicht blockierend sein ('<='). – Greg

+0

danke ich wusste nie über diese – John

Antwort

3

Sie haben nie zurückgesetzt, also bleibt Ihre Statusmaschine nicht initialisiert. Sie sollten dies beheben, indem Sie Ihrer case-Anweisung einen Zweig default hinzufügen. Wenn Ihr DUT dann in einem nicht kodierten Zustand auftaucht, ist es garantiert in einen bekannten Zustand zu geraten.

+0

arbeitete wie ein Charme! ich danke dir sehr – John