【问题标题】:Using don't-care in enumeration typedef in synthesizable SystemVerilog在可综合 SystemVerilog 的枚举 typedef 中使用 don't-care
【发布时间】:2019-06-26 23:41:31
【问题描述】:

我有以下代码:

typedef enum logic [1:0] {
  CMD1 = 2'b1?,
  CMD2 = 2'b01,
  CMD3 = 2'b00
} cmd_t;

基本上,如果 MSB 为 1,则为 CMD1(我将使用 LSB 作为索引的一部分)。如果 MSB 为 0,则解码命令的其余位。

然后我尝试使用 always_comb 进行解码:

cmd_t myCmd;
always_comb begin
  casez(myCmd)
    CMD1: isCmd1 = 1'b1;
    CMD2: isCmd1 = 1'b0;
    default: isCmd1 = 1'b0;
  endcase
end

不幸的是,我从 Spyglass 收到了这条消息:

[12EE]   W467 Based number 2'b1? contains a don't-care (?) - might lead to simulation/synthesis mismatch

这段代码应该是可合成的,不是吗?可以安全地放弃这个 Spyglass 警告吗?

【问题讨论】:

  • 它在抱怨哪一行?在您的示例中挥动它应该是可以的,除非枚举的其他用法。
  • 顺便说一句,您的enum 定义中有语法错误。它应该是CMD = 2``b1?=,而不是:。这可能会导致您的错误。
  • 它在抱怨这一行:CMD1: isCmd1 = 1'b1;

标签: system-verilog synthesis


【解决方案1】:

我怀疑这是否能正确合成。我认为 Spyglass 的信息具有误导性。在 Verilog(和 SystemVerilog)中,? 的含义完全z 相同。您正在指定一个具有 4 状态基本类型值的枚举,其中 CMD1 将由 2'b1z 精确表示。

【讨论】:

  • 但如果该值用作 casez 中的标签(如在 OP 的示例中),这绝对没问题。在其他情况下会出现问题,例如如果它出现在 rhs 中。
  • 它仍然意味着完全z 相同,即使在casez 中也是如此。只是casez 中的z 表示“不在乎”。
  • true,但在 OPs 情况下不会导致综合问题。
  • @Serge 我试过了(不是回答这个问题,而是回答客户的问题)。我不记得我会使用哪个合成器(可能是 FPGA 合成器),但我很确定它不起作用。
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多