在 verilog 模块中处理无效或非法输入组合的最佳做法是什么?

What is the best practice to handle invalid or illegal combinations of inputs in a verilog module?

当我为需要多个控制输入的更大项目编写模块时,什么是最好的practice/standard来处理无效或非法的输入组合?

例如,我有一个具有三个控制信号的队列 - EnqueueDequeueDelete。假设在一个循环中只能执行其中一个操作。因此,一次只能断言一个输入信号。现在,当某些父模块同时驱动两个控制信号时,正确的处理方法是什么?

在我的项目中,我可以随心所欲地处理它,我会注意避免它。但是在公司范围内,有人可能会在以后搞砸并使用不当。防止这个问题的做法是什么?或者换句话说,我在 verilog.

中寻找类似于 try-catch/exception 的东西

这是 断言 有用之处的经典示例。我们不倾向于在我们的芯片中放置错误检查逻辑(除非我们正在设计一些安全关键的东西);相反,我们使用断言。 属性 是关于您的设计的潜在事实(例如 "only one input signal is asserted at a time")。 断言 是 属性 应该为真 的陈述。

您可以使用正式工具或通过模拟来检查断言。在你的情况下,后者是有道理的。因此,您将实施适当的检查(断言),然后 运行 所有模拟并确保断言永远不会失败。

那么,如何实现断言呢?如何编码?你可以

i) 切换到 SystemVerilog。 SystemVerilog 有一个 assert 语句,对基本断言很有用,SystemVerilog 有一个叫做 SystemVerilog Assertions (SVA) 的部分,它更强大。 Verilog 只是 SystemVerilog 的一个子集,但是转换显然说起来容易做起来难——您可能需要更改公司政策或购买更昂贵的许可证或一些培训...

ii) 用其他语言编写断言(例如 SVA 或 PSL,但使用 Verilog 编写代码。同样,说起来容易做起来难 - 您可能需要更改公司政策或购买更昂贵的许可证或者一些培训..

iii) 使用 OVL。这是一个免费的、可下载的模块库,用于实现基本(和不太基本的)断言。有一个用 Verilog 编写的版本,因此不需要更改公司政策或许可证,但您必须花一些时间学习如何使用它们。

iv) 在 Verilog 中编写断言。您可以将它们隐藏在 generate 语句中(如果必须,也可以隐藏在 ifdefs 中),以使它们远离合成器,例如:

generate if (ASSERTIONS_ENABLED)
  begin : ASSERT_ONLY_ONE_OF_Enqueue_Dequeue_Delete
    always @(posedge clock)  // it is nearly always better to check assertions synchronously
      if (Enqueue + Dequeue + Delete > 2'b1) 
        $display("ASSERTION FAIL : ASSERT_ONLY_ONE_OF_Enqueue_Dequeue_Delete");
  end
endgenerate

(SVA 和 PSL 的链接指向我公司的网站。但无论如何,这些在 Google 结果中排在第一位。)