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

Verilog 在assign语句中使用长嵌套if-else是一种不好的做法吗?,verilog,system-verilog,Verilog,System Verilog,我有时在verilog中使用长assign语句,它嵌套了if-else循环 范例 assign a = (b) ? '1 : ((c&d) ? '0 : ((f&h) ? '1 : '0)); 另一种方法是使用always_comb逻辑块。然而,上述方法节省了时间,并且易于快速编写代码 这个问题的答案可能更多的是个人观点,但一般来说,像这样的长嵌套条件语句被认为是糟糕的编程风格,因为它们很难调试和维护: 除此之外,在always_comb中,您还可以使用case语句: case

我有时在verilog中使用长assign语句,它嵌套了if-else循环

范例

assign a = (b) ? '1 : ((c&d) ? '0 : ((f&h) ? '1 : '0));

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

这个问题的答案可能更多的是个人观点,但一般来说,像这样的长嵌套条件语句被认为是糟糕的编程风格,因为它们很难调试和维护:

除此之外,在always_comb中,您还可以使用case语句:

casez ({b,c,d,f,h})
    5'b1????: '1
    5'b011??: '0
    5'b00011: '1
    default: '0
endcase
您还可以使用
优先级、唯一性和唯一性\u 0
格式限定
casez
嵌套条件连续赋值没有错,但有一些方法可以使其更具可读性:

assign a = (b)    ? '1
         : (c&d)  ? '0
         : (f&h)  ? '1
                  : '0;
然而,这仍然是一个“if…else if…else if…else”结构,您应该问自己的一个问题是,这段代码打算做什么,以及它将如何“读取”。如果上面的代码使用的是always和“if…else if…else if…else if…else”结构,则可能更易于阅读(同时合成相同的代码)

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

assign a = (state == STATE1) ? '1
         : (state == STATE2) ? '0
         : (state == STATE3) ? '1 
           /* default */     : '0;
可读性 请注意,你所显示的表单可能会节省代码的原始键入时间,但是在你的代码可读性方面有更高的价值。如果你自己,或者另一个设计师,在一年或更久的时候看代码会欣赏一个允许他们快速掌握逻辑在做什么的形式。
通过使用支持自动扩展代码段(或缩写)的编辑器,可以加快编码速度而不损失可读性。我使用vim的缩写可以真正加快所有块结构输入,对齐脚本允许我垂直对齐给定字符(如“=”或“(”)或选择中的字符串。

有什么问题:
分配a=b(~(c&d)&f&h)
?这个问题的答案可能更多的是个人观点,但一般来说,像这样的长嵌套条件语句被认为是糟糕的编程风格,因为它们很难调试和维护:这会给合成工具带来额外负担吗?@Qiu,
a
可能不是一个单独的位LUE是SystemVerilog
'0
'1
,因此您的等式不一定相等。@新手:我不认为if-else和条件赋值会影响合成。在调试方面,在嵌套if-else语句的不同部分设置断点要容易得多,但条件赋值通常是同时进行的n定义了一个断点。我更喜欢
case(1'b1)
if()…else if()…else
而不是
casez()
。当选择的位数增加时,它更容易扩展。再加上写的
更少。@Greg:我同意,在某些情况下,case(1'b1)更有意义!