Verilog中的FSM状态更改
我已经看到以下用于在Verilog模块中进行状态更改:Verilog中的FSM状态更改,verilog,fsm,state-machine,Verilog,Fsm,State Machine,我已经看到以下用于在Verilog模块中进行状态更改: state在顺序逻辑始终块中,最好使用非阻塞分配(在顺序逻辑始终块中,最好使用非阻塞分配(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