我正在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需要大量的内存;但是,如果我可以放下 cs 的8位值,我将有足够的空间用于其他事情 .

我无法弄清楚如何让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编码)