FSM状态在Verilog中更改

| 我已经看到了用于在Verilog模块中进行状态更改的以下内容:
state <= 2\'b10;
state <=  #1  IDLE;
为什么使用<=而不仅仅是=?使用#1的目的是什么?这有什么不同吗? 这是FSM的一些Verilog代码,显示了正在使用的第一个。如果将其替换为第二个,它会起到相同的作用吗?
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
    
已邀请:
在像您一样的顺序逻辑“ 3”块中,最好使用非阻塞分配(“ 4”)而不是阻塞分配(“ 5”)。仿真将更好地表示实际产生的逻辑。 在纯RTL Verilog代码中,如果对所有顺序逻辑都使用非阻塞分配,则没有理由使用6个延迟。 我还看到其他人像这样使用
#
延迟。有时是由于在同一模拟中混合了RTL和门网表。在其他时候,它是用来弥补建模不佳的。如果可以,您应该避免在RTL代码中使用延迟。 也可以看看: Verilog综合中的非阻塞分配,编码风格令人难以置信! 另外,最好使用ѭ8来命名您的每个州。如果将一个州命名为“ 9”而不是“ 10”,那将更有意义。     
Verilog本质上是不确定的。这意味着,一般而言,模拟有多种可能的结果,虽然结果各不相同,但根据标准是有效的。 为了避免时钟固定块的不确定性行为,您必须对其他块中使用的那些变量(非局部变量)使用非阻塞分配。有关更详细的分析,请参阅我关于该主题的博客文章: http://www.sigasi.com/content/verilogs-major-flaw 综合工具通常接受时钟固定块中非局部变量的块分配,但这确实是一个错误,因为它们无法保证合成逻辑的行为类似于模型(因为这种模型是不确定性的)。 与您从其他许多人(例如Cliff Cummings的流行论文)中听到的相反,您无需仅对局部变量使用非阻塞分配。局部变量完全可以接受块分配。这是相关的,因为它允许对内部建模使用纯的“变量”语义(如在编程语言中一样)。 在纯RTL样式建模中,#1延迟只是开销。     

要回复问题请先登录注册