我正在 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_INIT
、cs.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 编码)