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

时间:2016-05-31 03:04:06

标签: verilog

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

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

在我的项目中,我可以随心所欲地处理它,我会小心避免它。但是在公司范围内,有人可能会陷入困境并且使用不当。防止这个问题的做法是什么?换句话说,我正在try-catch/exception寻找与verilog类似的内容。

1 个答案:

答案 0 :(得分:3)

这是断言有用的典型示例。我们不倾向于在我们的芯片中加入错误检查逻辑(除非我们设计一些对安全至关重要的东西);相反,我们使用断言。 属性是关于您的设计的潜在事实(例如,"一次只有一个输入信号 断言")。 断言是属性应为true 的语句。

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

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

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

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

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

iv)在Verilog中写断言。您可以将它们隐藏在生成语句中(如果必须,则隐藏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搜索结果中的第一个。)