verilog中的FSM没有状态初始化或更改


`timescale 1ns/1ps
module div_by_3(
    input clk,
    input rst,
    output y
);
reg [1:0] state, nextstate;
//state encoding
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b10;
//state registers
always@(posedge clk or negedge rst) begin
    if(rst)     state <= S0;
    else        state <= nextstate;
end
//next state logic
always@(*) 
    case(state) 
        S0  :   nextstate   =   S1;
        S1  :   nextstate   =   S2;
        S2  :   nextstate   =   S0;
        default :   nextstate   =   S0;     
     endcase
//output logic
assign y = (state   == S0);
endmodule
//======================================================================// 
//                            Test Bench
//======================================================================//
`timescale 1ns/1ps
 module div_by_3_tb();
 //=====================================================
 //                 Clock
 //=====================================================
  parameter clk_per = 10;
  reg Clk;
  initial Clk = 1'b0;
  always #(clk_per * 0.5) Clk = ~Clk;
  //=====================================================
  //                    Instances
  //=====================================================
  parameter dly = 2;
  reg       rst ;
  wire      out ;
  reg       out_start   ;
  div_by_3 uut(
      .clk(Clk),
      .rst(rst),
      .y(out)
  );
  //=====================================================
  //                    Inputs
  //=====================================================
  initial begin
    //Initialize inputs
    rst = 1'b1;
    #(dly)  rst = 1'b0;
    out_start   = 1'b0;
    #(clk_per * 20)     out_start = 1'b1;
    $finish;
  end
  //=====================================================
  //                    Verify
  //=====================================================
  initial begin
      wait(out_start==1'b1) begin
          $display("Simulation complete...");
      end
  end
  //=====================================================
  //                    Dump Waves
  //=====================================================
  initial begin
      $dumpfile("div_by_3.vcd");
      $dumpvars;
  end
  endmodule

我试图用3个计数器对一个简单的鸿沟建模。我正在使用icarus verilog 0.9.7模拟器(在线(,并且运行代码后,我看不到任何状态变化(状态仍然卡在x上(。我无法找出原因。仿真工具是问题,还是代码不正确?

您的代码不正确。错误是rst的极性。解决此问题的一种方法是更改:

always@(posedge clk or negedge rst) begin

to:

always@(posedge clk or posedge rst) begin

最新更新