表达式的位长应由表达式中涉及的操作数和表达式所在的上下文决定。自定(self-determined)表达式是指表达式的位长完全由表达式本身决定--例如,一个常数。由上下文决定(context-determined)的表达式是指表达式的位长由表达式的位长和表达式是另一个表达式的一部分这一事实决定。例如,如上一篇博文的示例,赋值操作的右侧表达式位长取决于其自身和左侧表达式的位长。
表1显示了表达式的形式如何决定表达式结果的位长。在该表中,i、j 和 k 表示操作数的表达式,L(i) 表示 i 所代表操作数的位长。
表1:自定表达式产生的位长
将乘法运算结果分配到足够宽的位长,就可以在不丢失任何溢出位的情况下进行乘法运算。
表达式位长问题举例:
在表达式求值过程中,临时结果应取最大操作数的大小(如果是赋值,也包括左侧操作数)。且必须注意防止最高有效位丢失。下面的示例描述了操作数的位长如何导致最高有效位丢失。
首先,定义了2个reg变量:
目的是测试以下表达式的结果:
其中 a 和 b 相加,可能导致溢出,然后右移 1 位,以保留 16 位结果中的进位。由于表达式中所有操作数的位宽都是 16 位,表达式 ( a + b ) 产生的临时结果只有 16 位宽,从而在求值执行 1 位右移操作前就丢失了进位。
解决方法是强制表达式 ( a + b ) 至少使用 17 位进行运算。例如,在表达式中添加一个整数值 0 将导致使用整数的位大小进行运算。下面的示例将产生预期的结果:
在下面例子中:
$display 语句将输出:answer = 01000。
表达式 a&b 本身的位长为 4,但由于它处于条件表达式的上下文中,而条件表达式使用的是最大位长,因此表达式 a&b 的实际长度为 5,即 d 的长度。
下面给出自定表达式示例:
上面这个例子的结果为:
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!