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

在verilog模块中处理无效或非法输入组合的最佳实践是什么?,verilog,Verilog,当我为一个需要几个控制输入的较大项目编写模块时,处理无效或非法输入组合的最佳实践/标准是什么 例如,我有一个队列,它有三个控制信号-Enqueue、Dequeue和Delete。假设一个循环中只能执行一个操作。因此,一次只能断言一个输入信号。现在,当某个父模块一次驱动两个控制信号时,处理这种情况的正确方法是什么 在我的项目中,我可以以任何方式处理它,我会小心避免它。但在整个公司范围内,可能会有人后来搞砸并不当使用它。预防这一问题的做法是什么?或者换句话说,我在verilog中寻找类似于try c

当我为一个需要几个控制输入的较大项目编写模块时,处理无效或非法输入组合的最佳实践/标准是什么

例如,我有一个队列,它有三个控制信号-
Enqueue
Dequeue
Delete
。假设一个循环中只能执行一个操作。因此,一次只能断言一个输入信号。现在,当某个父模块一次驱动两个控制信号时,处理这种情况的正确方法是什么


在我的项目中,我可以以任何方式处理它,我会小心避免它。但在整个公司范围内,可能会有人后来搞砸并不当使用它。预防这一问题的做法是什么?或者换句话说,我在
verilog

中寻找类似于
try catch/exception
的东西这是一个断言有用的经典示例。我们不倾向于在我们的芯片中加入错误检查逻辑(除非我们正在设计一些安全关键的东西);相反,我们使用断言。属性是有关设计的潜在事实(例如“一次只断言一个输入信号”)。断言是属性应该为true的语句

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

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

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

ii)用其他语言编写断言(如SVA或,但用Verilog编写代码。再说一遍,说起来容易做起来难——再说一遍,你可能需要改变公司政策或购买更昂贵的许可证或培训

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

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

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的链接都指向我公司的网站。但无论如何,这些都是谷歌搜索结果中的第一个。)