Enums QuartusII合成:枚举类型到状态信号(编码)

Enums QuartusII合成:枚举类型到状态信号(编码),enums,verilog,system-verilog,fsm,quartus,Enums,Verilog,System Verilog,Fsm,Quartus,我正在SystemVerilog中设计一个FSM,通过QuartusII(14.1)工具在Altera FPGA上进行合成。我使用枚举声明使代码更加合理: typedef enum logic [7:0] { CMD_INIT, CMD_WAIT, CMD_DECODE, CMD_ILLEGAL,

我正在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合成这个状态机时,它似乎会创建一个热编码,尽管类型中有
逻辑[7:0]
部分。如中所示,当我将状态添加到SignalTap时,我将所有状态作为一个信号1位变量(
cs.CMD\u INIT
cs.CMD\u 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合成为顺序编码而不是1热编码)

您可以使用合成杂注来指导Quartus为状态变量使用特定的编码方案。这为您提供了如何使用“顺序”编码对状态机进行编码的详细信息,从而避免了默认的一次热编码。

尝试使用第13-66页提供的SM编码指南。可能是合成器没有正确地推断出状态机。特别是它说:“如果您没有将枚举类型指定为int unsigned,默认情况下将使用有符号int类型。在这种情况下,Quartus II集成合成设计,但不会推断或优化作为状态机的逻辑。”@EugeneSh。它确定这是一个FSM(在“状态机”报告中有)。我正在尝试更改类型以查看它所显示的内容。我确实注意到了一个警告,告诉我“不能使用最小数量的位来编码状态机”,所以这可能是它的一部分。虽然当我在状态机报告下查看有问题的FSM时,我得到了我期望的编码(6位,顺序)。但我在SignalTap中找不到:(@EugeneSh.我尝试将类型更改为int unsigned,但Quartus的行为相同;我非常确定它根据报告正确识别状态机,甚至可能在内部正确表示FSM;但是SignalTap似乎无法访问编码的cs行…这就是我需要的…您如何声明您的case语句?
case(cs)
unique case(cs)
priority case(cs)
case(1'b1)
变体?对于1-hot来说,
case(1'b1)
变体非常常见。
unqiue
强制执行并行案例满案例指令。