我想知道以下代码的行为。总有两个模块,一个是组合来计算next_state
信号,另一个是顺序的,它将执行一些逻辑并确定是否关闭系统。它通过将shutdown_now
信号设置为高电平然后调用来完成此操作state <= next_state
。
我的问题是,如果在线路shutdown_now
之前以阻塞的方式设置信号(在时钟周期n内)的条件成立,那么state <= next_state
时钟周期n + 1内的状态是否为SHUTDOWN
或RUNNING
?换句话说,shutdown_now = 1'b1
由于state
信号通过next_state
确定而依赖于该状态,因此该线路是否在两个状态机上都处于阻塞状态?
enum {IDLE, RUNNING, SHUTDOWN} state, next_state;
logic shutdown_now;
// State machine (combinational)
always_comb begin
case (state)
IDLE: next_state <= RUNNING;
RUNNING: next_state <= shutdown_now ? SHUTDOWN : RUNNING;
SHUTDOWN: next_state <= SHUTDOWN;
default: next_state <= SHUTDOWN;
endcase
end
// Sequential Behavior
always_ff @ (posedge clk) begin
// Some code here
if (/*some condition*/) begin
shutdown_now = 1'b0;
end else begin
shutdown_now = 1'b1;
end
state <= next_state;
end
Miles,实际上您只有一个状态机,这就是always_comb块中的代码。always_ff只是创建一个寄存器来保存您的状态。
现在编写代码的方式将按照以下顺序执行关闭:
不确定是否需要在always_ff块中包含关闭逻辑。如果将代码移至always_comb块,则可以将其余代码保持不变,并且状态机将在周期n + 1中移至SHUTDOWN状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句