System verilog 输出总是X

System verilog 输出总是X,system-verilog,state-machine,System Verilog,State Machine,每当我为systemverilog代码编写测试台时,输出似乎总是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, A

每当我为systemverilog代码编写测试台时,输出似乎总是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
always@ (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
always@ (posedge clk)
    case(state)
       S0: pattern= A;
       S1: pattern= B;
       S2: pattern= Ab;
       S3: pattern= Bb;
    endcase
endmodule

我不确定是我的有限状态机错了,还是测试台错了。希望得到一些帮助,提前谢谢。

您从未声明过重置,因此您的状态机仍处于未初始化状态。您应该通过在case语句中添加
default
分支来解决此问题。然后,如果您的DUT出现在未编码状态,则它保证进入已知状态

您从未断言过重置,因此您的状态机仍处于未初始化状态。您应该通过在case语句中添加
default
分支来解决此问题。然后,如果您的DUT出现在未编码状态,则它保证进入已知状态

你把阻塞/非阻塞搞混了。组合(
始终_comb
/
始终@*
)应该被阻塞(
=
)。Sequential(
@(posedge clk)
)应该是非阻塞的(
谢谢,我从来不知道你把阻塞/非阻塞搞混了。combination(
总是梳
/
总是*
)应该是阻塞的(
=
)。Sequential(
@(posedge clk)
)应该是非阻塞的(
谢谢你我从来不知道这件事
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