来自微信公众号 “数字芯片实验室”
本文详细介绍了可综合有限状态机的Verilog coding styles,以及one-always FSMs和two-always FSMs的优缺点。
State Machine Classification
根据状态机输出生成的方式有两种类型状态机,
Moore State Machine,输出仅是当前状态(present state)的函数。
Mealy State Machine, 输出是当前状态和输入的函数。可以看到下图中的虚线标注了Mealy State Machine Only
除了根据状态输出的生成方式分类,还可以根据状态编码的方式进行分类, binary-encode,gray-encode, Johnson-encode, one-hot-encode。
FSM Verilog Modules
Guideline:使用一个单独的模块(module)编码状态机,方便状态机定义(definition)、修改(modification)和调试(debug)。
State Assignments
Guideline:使用symbolic parameters进行状态赋值,增加可读性,简化状态的修改
下面是相应的binary encoding和one-hot encoding
Parameter definitions for binary encoding
parameter [2:0] // synopsys enum code
IDLE = 3'd0,
S1 = 3'd1,
S2 = 3'd2,
S3 = 3'd3,
ERROR = 3'd4;
Parameter definitions for verbose one-hotencoding
parameter [4:0] IDLE = 5'b00001,
S1 = 5'b00010,
S2 = 5'b00100,
S3 = 5'b01000,
ERROR = 5'b10000;
Theone-hot encoding can yield very efficient FSMs for state machines that have many interconnections with complex equations, including a large number of connections to one particular state.
也可以使用宏定义(\`define)定义状态名称, \`define会创建一个全局定义(global definition),parameters会创建一个局部定义(local definition),从而parameters定义允许设计在不同的模块具有多个同名的之间状态定义,例如IDLE。
Two-Always Block State Machine
Two-Always状态机包含生成下一状态的组合逻辑(next state combinational logic)、生成输出的组合逻辑(output combinational logic)和更新当前状态的时序逻辑(clocked present state logic)。
Sequential Always Block
Guideline:在建模时序逻辑时,仅使用Verilog非阻塞赋值。(当然,这也不全对,参考使用阻塞赋值和非阻塞赋值建模的分频时钟)
always @(posedge clk or posedge rst)
if (rst) state <= IDLE;
else state <= next;
Combinational Always Block
Guideline:在建模组合逻辑always语句块中仅使用阻塞赋值。
该always语句块用于获得需要被更新的下一个状态值,其被一个敏感列表(当前状态和输入)。
应该在always语句块之后编码一个默认的下一个状态赋值语句。默认赋值可以是X(综合工具don't cares)、IDLE和任意状态。因为存在组合逻辑综合出锁存器问题,这在实例解析Verilog综合出锁存器的问题中曾经探讨过。
always @(state or i1 or i2 or i3 or i4) begin
next = IDLE;
case (state)
IDLE: begin
next = ERROR;
if (!i1) next = IDLE;
if (i1 & i2) next = S1;
if (i1 & !i2 & i3) next = S2;
end
S1: ...
FSM Output Generation
输出逻辑可在编码在连续赋值assign中
assign rd_out = (state == READ) & !rd_strobe_n;
也可以编码在组合逻辑always语句块中。
case(state)
...
READ: if (!rd_strobe_n) rd_out = 1'b1;
One-Always Block State Machine
one-always状态机比two always的仿真效率更高,但是难以修改和调试。
Reference paper :
State Machine Coding styles for Synthesis
本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/mqVPlEWbIq\_VquySiKD9MQ
未经作者同意,请勿转载!
推荐阅读
- SNUG论文巡礼一:Design-Compiler Graphical 's improvement
- implicit nonstop pins,工具帮你定义的时钟需求
- 使用$test$plusargs优化设计仿真速度
想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。