SNUG论文巡礼系列二:FSM Coding styles for Synthesis

来自微信公众号 “数字芯片实验室”

本文详细介绍了可综合有限状态机的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优化设计仿真速度

想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。

发表评论

邮箱地址不会被公开。 必填项已用*标注