在赋值语句中使用长嵌套 if-else 是一种不好的做法吗?

new*_*bie 2 verilog system-verilog

我有时在verilog中使用长赋值语句,它有嵌套的if-else循环。

例子

assign a = (b) ? '1 : ((c&d) ? '0 : ((f&h) ? '1 : '0));
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用always_comb 逻辑块。然而,上述方法节省了时间并且易于快速编码。

Mar*_*n K 5

格式化

嵌套条件连续赋值没有任何问题,但有一些方法可以使其更具可读性:

assign a = (b)    ? '1
         : (c&d)  ? '0
         : (f&h)  ? '1
                  : '0;
Run Code Online (Sandbox Code Playgroud)

然而,这仍然是一个“if...else if...else if...else”结构,您应该问自己的一个问题是这段代码的含义是什么以及它将如何“读取”。如果上面的代码是使用always和“”if...else if...else if...else”结构的代码,则可能更容易阅读(同时合成相同的代码)。

以下是嵌套条件连续赋值的干净使用的示例:

assign a = (state == STATE1) ? '1
         : (state == STATE2) ? '0
         : (state == STATE3) ? '1 
           /* default */     : '0;
Run Code Online (Sandbox Code Playgroud)

可读性

请考虑,您显示的表单可能会节省最初键入代码的时间,但使代码可读具有更高的价值。无论是你自己,还是其他设计师,一年或更长时间后查看代码都会欣赏一种可以让他们快速掌握逻辑在做什么的形式。

通过使用支持自动扩展片段(或缩写)的编辑器,可以在不损失可读性的情况下加快编码速度。我使用带有缩写的 vim 来真正加快所有块结构输入的速度,以及允许我垂直对齐给定字符(如“=”或“(”)或选择中的字符串的对齐脚本。