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

时间:2014-04-15 18:12:35

标签: verilog system-verilog

我有时在verilog中使用long assign语句,它具有嵌套的if-else循环。

实施例

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

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

2 个答案:

答案 0 :(得分:4)

格式

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

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

然而,这仍然是“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;

可读性

请注意,您显示的表单可以节省代码原始输入的时间,但是让代码可读的价值更高。无论是你自己还是其他设计师,在一年或更长时间内查看代码将会欣赏一种形式,使他们能够快速掌握逻辑正在做什么。

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

答案 1 :(得分:3)

这个问题的答案可能更多是个人观点,但一般来说,像这样的长嵌套条件语句被认为是糟糕的编程风格,因为它们难以调试且难以维护:http://cse.psu.edu/~cg577/DOCUMENTS/codingstandards/verilog.html

除了always_comb中的if-else之外,您还可以使用case语句:

casez ({b,c,d,f,h})
    5'b1????: '1
    5'b011??: '0
    5'b00011: '1
    default: '0
endcase

您还可以使用casez来限定priority, unique, and unique_0