1

我正在 SystemVerilog 中设计一个 FSM,以便通过 QuartusII (14.1) 工具进行综合,以放在 Altera FPGA 上。我正在使用枚举声明使代码更加合理:

typedef enum logic [7:0] { CMD_INIT,
                           CMD_WAIT,
                           CMD_DECODE,
                           CMD_ILLEGAL,
                           CMD_CMD0,
                           ... } cmd_st;
...
cmd_st cs, ncs;
...

每当 Quartus 合成这个状态机时,它似乎创建了一个单热编码,尽管有logic [7:0]类型的一部分。例如,当我必须将状态添加到 SignalTap 时,我将所有状态作为信号 1 位变量(cs.CMD_INITcs.CMD_WAIT等)。虽然这通常非常有用,因为我需要一次查看一堆这些状态和一些超值,但我用完了片上内存来包含所有这些状态(其中有 8 个以上;比如 50 个) +)。因此,将它们全部添加到 SignalTap 会占用大量内存;但如果我可以把 8 位的值写下来cs,我就有足够的空间来做其他事情了。

我不知道如何让 Quartus 不对 FSM 使用 1-hot 编码。我尝试将设置(设置->编译器设置->高级设置(综合...)->状态机处理)更改为最小位、用户编码和顺序,以及为一些状态添加值:

typedef enum logic [7:0] { CMD_INIT           = 8'd0,
                           CMD_WAIT           = 8'd1,
                           CMD_DECODE         = 8'd2,
                           CMD_ILLEGAL        = 8'd3,
                           CMD_CMD0,

(注意,不是全部,因为有一堆我可能会在中间添加更多)

我不确定还能做什么,这样 SignalTap 只能看到 8 位的状态(这可能可以追溯到让 Quartus 将此 FSM 合成为顺序编码而不是 1hot 编码)

4

1 回答 1

0

您可以使用综合 pragma 来指导 Quartus 对状态变量使用特定的编码方案。本页详细介绍了如何使用“顺序”编码对状态机进行编码,从而避免使用默认的 one-hot 编码。

于 2018-12-14T20:50:51.557 回答