2016-11-22 3 views
0

Всякий раз, когда я пишу testbench для своего кода systemverilog, вывод всегда будет X, даже если реализация верна. Где моя ошибка?Выход всегда 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 

и вот мой испытательный стенд

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 

Я не уверен, если это мой конечный автомат, что это неправильно, или если это испытательный стенд. Надеюсь получить помощь, спасибо заранее.

+3

У вас заблокирована блокировка/неблокирование. Комбинация ('always_comb' /' always @ * ') должна блокироваться (' = '). Последовательный ('@ (posedge clk)') должен быть неблокирующим ('<='). – Greg

+0

спасибо Я никогда не знал об этом – John

ответ

3

Вы никогда не утверждали сброс, поэтому ваш государственный автомат остается неинициализированным. Вы должны исправить это, добавив ветку default в свой оператор case. Затем, если ваш DUT когда-нибудь появится в незашифрованном состоянии, он, как гарантируется, попадет в известное состояние.

+0

работал как шарм! Спасибо большое – John