我有时在verilog中使用long assign语句,它具有嵌套的if-else循环。
实施例
assign a = (b) ? '1 : ((c&d) ? '0 : ((f&h) ? '1 : '0));
另一种方法是使用always_comb逻辑块。但是,上述方法可以节省时间并且易于快速编码。
答案 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
。