Verilog中的FSM状态更改

Verilog中的FSM状态更改,verilog,fsm,state-machine,Verilog,Fsm,State Machine,我已经看到以下用于在Verilog模块中进行状态更改: state在顺序逻辑始终块中,最好使用非阻塞分配(在顺序逻辑始终块中,最好使用非阻塞分配(Verilog本质上是不确定的。这意味着,一般来说,模拟有多种可能的结果,这些结果都是不同的,但根据标准是有效的 为了避免时钟始终块的非确定性行为,您必须对其他块中使用的变量(非局部变量)使用非阻塞分配。有关更详细的分析,请参阅我的博客文章: 合成工具通常接受时钟始终块中非局部变量的块分配,但这实际上是一个错误,因为它们无法保证合成逻辑的行为与模型类

我已经看到以下用于在Verilog模块中进行状态更改:


state在顺序逻辑
始终
块中,最好使用非阻塞分配(
在顺序逻辑
始终
块中,最好使用非阻塞分配(
Verilog本质上是不确定的。这意味着,一般来说,模拟有多种可能的结果,这些结果都是不同的,但根据标准是有效的

为了避免时钟始终块的非确定性行为,您必须对其他块中使用的变量(非局部变量)使用非阻塞分配。有关更详细的分析,请参阅我的博客文章:

合成工具通常接受时钟始终块中非局部变量的块分配,但这实际上是一个错误,因为它们无法保证合成逻辑的行为与模型类似(因为这样的模型是不确定的)

与你将从其他许多人那里听到的不同,比如克里夫·卡明斯(Cliff Cummings)的流行论文,没有必要只对局部变量使用非阻塞赋值。阻塞赋值对局部变量来说是完全可以接受的。这是相关的,因为它允许使用纯“变量”语义(如在编程语言中)用于内部建模


在纯RTL风格的建模中,#1延迟只是开销。

Verilog本质上是不确定的。这意味着,一般来说,模拟有多种可能的结果,这些结果都是不同的,但根据标准是有效的

为了避免时钟始终块的非确定性行为,您必须对其他块中使用的变量(非局部变量)使用非阻塞分配。有关更详细的分析,请参阅我的博客文章:

合成工具通常接受时钟始终块中非局部变量的块分配,但这实际上是一个错误,因为它们无法保证合成逻辑的行为与模型类似(因为这样的模型是不确定的)

与你将从其他许多人那里听到的不同,比如克里夫·卡明斯(Cliff Cummings)的流行论文,没有必要只对局部变量使用非阻塞赋值。阻塞赋值对局部变量来说是完全可以接受的。这是相关的,因为它允许使用纯“变量”语义(如在编程语言中)用于内部建模

在纯RTL风格的建模中,#1延迟只是开销

module fsm( clk, rst, inp, outp);

   input clk, rst, inp;
   output outp;

   reg [1:0] state;
   reg outp;

   always @( posedge clk, posedge rst )
   begin
   if( rst )
       state <= 2'b00;
   else
   begin
       case( state )
       2'b00:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b10;
       end

       2'b01:
       begin
            if( inp ) state <= 2'b11;
            else state <= 2'b10;
       end

       2'b10:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b11;
       end

       2'b11:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b10;
       end
       endcase
   end
end